ParcoursOuvrir l'appli

Parcourir, compter, regrouper

Python, dictionnaires et compréhensions · 45 min

Parcourir un dictionnaire

Trois façons de parcourir un dictionnaire avec for :

Écriture Donne à chaque tour
for cle in d: chaque clé
for valeur in d.values(): chaque valeur
for cle, valeur in d.items(): chaque paire, dans deux variables
prix = {"riz": 1200, "savon": 500}
for produit, montant in prix.items():
    print(f"{produit} : {montant} FCFA")
riz : 1200 FCFA
savon : 500 FCFA

.items() est la plus utile. On l'a déjà vu avec enumerate et zip : deux variables séparées par une virgule reçoivent les deux morceaux de chaque élément.

Depuis Python 3.7, un dictionnaire garde l'ordre d'insertion : on le parcourt dans l'ordre où les paires ont été ajoutées.

Et comme pour les listes : sum(d.values()) donne la somme des valeurs, max(d.values()) la plus grande.

Le motif du compteur

Le motif le plus utile des dictionnaires : compter combien de fois chaque chose apparaît. C'est un accumulateur, mais avec une case par catégorie.

votes = ["Awa", "Boris", "Awa", "Chantal", "Awa", "Boris"]

compteur = {}
for nom in votes:
    compteur[nom] = compteur.get(nom, 0) + 1

print(compteur)    # {'Awa': 3, 'Boris': 2, 'Chantal': 1}

La ligne clé, compteur[nom] = compteur.get(nom, 0) + 1, se lit de droite à gauche :

  1. compteur.get(nom, 0) : combien de votes nom a déjà ? 0 si c'est la première fois qu'on le voit ;
  2. + 1 : on ajoute ce vote ;
  3. compteur[nom] = ... : on range le nouveau total.

Sans .get, la première apparition de chaque nom provoquerait un KeyError.

Le même motif pour additionner par catégorie

for produit, montant in ventes:
    total[produit] = total.get(produit, 0) + montant

C'est exactement ce que fait le fameux groupby de pandas, ou le GROUP BY de SQL, que tu verras dans le module données.

Compter les mots d'une phrase

Lance, puis remplace la phrase par une phrase à toi. .split() découpe un texte en liste de mots (aux espaces).

phrase = "le chat voit le chien et le chien voit le chat"
mots = phrase.split()
print(mots)

compteur = {}
for mot in mots:
    compteur[mot] = compteur.get(mot, 0) + 1

for mot, n in compteur.items():
    print(f"{mot} : {n}")

Exercice : Le dépouillement

Compte les votes dans un dictionnaire resultats : pour chaque candidat, le nombre de voix.

Voir une solution
bulletins = ["Ngono", "Mballa", "Ngono", "Essomba", "Ngono", "Mballa"]   # donné

resultats = {}
for nom in bulletins:
    resultats[nom] = resultats.get(nom, 0) + 1

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Le chiffre d'affaires par produit

ventes est une liste de ventes. Chaque vente est une liste de deux éléments : le produit et le montant. Calcule dans par_produit le total vendu pour chaque produit.

Astuce : for produit, montant in ventes: déballe chaque petite liste dans deux variables.

Voir une solution
ventes = [["riz", 2400], ["savon", 1500], ["riz", 1200], ["huile", 3000], ["savon", 500]]   # donné

par_produit = {}
for produit, montant in ventes:
    par_produit[produit] = par_produit.get(produit, 0) + montant

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Le produit vedette

À partir du dictionnaire par_produit (donné), trouve dans vedette le nom du produit qui a rapporté le plus. Parcours les paires avec .items(), avec le motif du maximum.

Voir une solution
par_produit = {"riz": 3600, "savon": 2000, "huile": 3000}   # donné

vedette = None
meilleur = None
for produit, montant in par_produit.items():
    if meilleur is None or montant > meilleur:
        meilleur = montant
        vedette = produit

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Le mot le plus fréquent

Combine tout. Trouve dans plus_frequent le mot qui revient le plus souvent dans texte, sans tenir compte des majuscules.

Étapes : mettre en minuscules, découper avec .split(), compter dans un dictionnaire, puis chercher le maximum.

Voir une solution
texte = "Le riz est cher. Le savon est cher. Le riz est rare."   # donné

compteur = {}
for mot in texte.lower().split():
    compteur[mot] = compteur.get(mot, 0) + 1
plus_frequent = max(compteur, key=compteur.get)

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice