Itérer sur un dictionnaire

On a vu que la boucle for ne se limitait pas aux listes : elle permet aussi d’itérer sur les chaînes de caractères et les range par exemple. Plus généralement, un for itère sur un objet dit itérable.

Et ça tombe bien : les dictionnaires sont itérables !

Dictionnaire et boucle for

Mais itérer sur un dictionnaire, qu’est-ce que ça veut dire ?

En fait un dictionnaire peut être vu comme un ensemble de clés. Itérer sur un dictionnaire revient donc à itérer sur ces clés.

>>> phonebook = {'Alice': '0633432380', 'Bob': '0663621029', 'Alex': '0714381809'}
>>> for name in phonebook:
...     print(name)
...
Alice
Bob
Alex

Et à partir d’une clé, il est facilement possible d’accéder à la valeur associée, grâce à l’opérateur [].

>>> for name in phonebook:
...     print(name, ':', phonebook[name])
...
Alice : 0633432380
Bob : 0663621029
Alex : 0714381809

Si vous utilisez une version de Python antérieure à 3.6, il se peut que vous obteniez un ordre différent dans les itérations. En effet, l’ordre des éléments dans un dictionnaire était auparavant aléatoire.

Le fait qu’un dictionnaire soit itérable le rend donc convertible en liste (en appelant list) ce qui aura pour effet de renvoyer la liste des clés.

>>> list(phonebook)
['Alice', 'Bob', 'Alex']

Autres manières d'itérer

On sait itérer sur les clés et récupérer la valeur associée à chaque clé, mais est-ce qu’il n’y a pas plus simple ? En effet, imaginons que nous ne soyons intéressés que par les valeurs du dictionnaire, pourquoi s’encombrer avec les clés ?

Les dictionnaires possèdent pour cela une méthode values renvoyant l’ensemble des valeurs du dictionnaire, sans les clés.

>>> phonebook.values()
dict_values(['0633432380', '0663621029', '0714381809'])

La méthode renvoie un objet d’un type un peu spécial, dict_values. Il s’agit en fait d’une « vue », une sorte de liste qui n’existe pas en tant que telle en mémoire (il n’y a pas de séquence d’éléments) mais qui sait où aller chercher ses éléments.
Il n’y a donc pas de duplication des données, la vue référence juste les valeurs du dictionnaire.

Et cet objet un peu spécial est bien sûr itérable :

>>> for phone in phonebook.values():
...     print('Numéro de téléphone :', phone)
... 
Numéro de téléphone : 0633432380
Numéro de téléphone : 0663621029
Numéro de téléphone : 0714381809

De façon symétrique on trouve aussi une méthode keys pour renvoyer une vue sur les clés.

>>> phonebook.keys()
dict_keys(['Alice', 'Bob', 'Alex'])

Itérer sur cette vue revient donc à itérer directement sur le dictionnaire, mais comme on dit « explicit is better than implicit »1.

>>> for name in phonebook.keys():
...     print(name)
... 
Alice
Bob
Alex

Enfin, les dictionnaires disposent d’une troisième vue très utile, la vue items. Cette vue renvoie les couples clé/valeur du dictionnaire.

>>> phonebook.items()
dict_items([('Alice', '0633432380'), ('Bob', '0663621029'), ('Alex', '0714381809')])

Étant donné qu’il s’agit de couples, on peut itérer sur cette vue en précisant deux variables dans notre for : une pour recevoir la clé et une pour la valeur.

>>> for name, phone in phonebook.items():
...     print(name, ':', phone)
... 
Alice : 0633432380
Bob : 0663621029
Alex : 0714381809
Conversions

On l’a vu, on peut convertir un dictionnaire en liste, ce qui nous renvoie la liste de ses clés.

Les différentes vues que nous venons de voir sont elles aussi convertibles. Plus généralement, tout objet itérable (que l’on peut parcourir avec un for) est convertible en liste via un appel à list.

>>> list(phonebook.keys())
['Alice', 'Bob', 'Alex']
>>> list(phonebook.values())
['0633432380', '0663621029', '0714381809']
>>> list(phonebook.items())
[('Alice', '0633432380'), ('Bob', '0663621029'), ('Alex', '0714381809')]

Que représentent les parenthèses dans le dernier exemple ? La réponse est dans le prochain chapitre. :)


  1. Il s’agit d’un « vers » extrait de la PEP20, un « poème » qui décrit la philosophie de Python.