HOWTO · Python

Comment obtenir les clés d’un dictionnaire sous forme de liste en Python

Obtenez les clés d’un dictionnaire Python sous forme de liste avec list(), une boucle, une compréhension ou le dépaquetage, et distinguez la vue dict_keys d’une liste.

Sur cette page

Pour obtenir les clés d’un dictionnaire Python sous forme de liste, utilisez list(my_dict). L’expression list(my_dict.keys()) produit la même liste. Dans les deux cas, le constructeur list() rassemble les clés dans une nouvelle liste. En revanche, my_dict.keys() seul renvoie une vue dict_keys : on peut la parcourir, mais pas accéder à ses éléments par indice comme dans une liste. Effectuez la conversion si vous avez besoin d’un objet liste ; sinon, parcourir directement le dictionnaire suffit généralement.

Obtenir les clés d’un dictionnaire Python avec dict.keys()

La méthode dict.keys() renvoie une vue des clés actuelles. Cette vue reflète les modifications apportées ensuite au dictionnaire, tandis qu’une liste créée à partir d’elle reste une copie distincte de son contenu au moment de la conversion. Depuis Python 3.7, le parcours d’un dictionnaire respecte l’ordre d’insertion ; l’ordre affiché ci-dessous repose sur ce comportement.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys_view = state_capitals.keys()
print(keys_view)
for state in keys_view:
    print(state)

keys_list = list(keys_view)
print(keys_list)
print(list(state_capitals))
print(keys_list[0])

state_capitals["Nevada"] = "Carson City"
print(list(keys_view))
print(keys_list)
dict_keys(['California', 'Pennsylvania', 'Texas'])
California
Pennsylvania
Texas
['California', 'Pennsylvania', 'Texas']
['California', 'Pennsylvania', 'Texas']
California
['California', 'Pennsylvania', 'Texas', 'Nevada']
['California', 'Pennsylvania', 'Texas']

list(keys_view) et list(state_capitals) créent tous deux des listes : la seconde expression fonctionne parce que parcourir un dictionnaire donne ses clés. Essayer d’accéder directement à un élément de la vue par indice provoque une TypeError. Avec un dictionnaire vide, la conversion donne [] ; tenter d’accéder à un élément de cette liste vide provoque une IndexError.

Obtenir les clés d’un dictionnaire Python avec une boucle

Une boucle explicite est utile si vous devez traiter chaque clé au moment où vous l’ajoutez à la liste. Écrivez for key in state_capitals : le mot-clé in est indispensable, et la boucle parcourt les clés, pas les valeurs.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys = []
for key in state_capitals:
    keys.append(key)
print(keys)
['California', 'Pennsylvania', 'Texas']

Si le dictionnaire est vide, la boucle ne s’exécute pas et keys reste vide. Si vous souhaitez seulement récupérer les clés sans autre traitement dans la boucle, list(state_capitals) est plus concis.

Obtenir les clés d’un dictionnaire Python par compréhension de liste

Une compréhension de liste permet d’écrire la même collecte en une ligne. Cette forme est intéressante si vous comptez filtrer les clés ou transformer chacune d’elles ; pour une simple copie, le constructeur list() est plus simple.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys = [key for key in state_capitals]
print(keys)
['California', 'Pennsylvania', 'Texas']

Cette compréhension renvoie également [] si le dictionnaire est vide.

Obtenir les clés d’un dictionnaire Python avec l’opérateur de dépaquetage *

La syntaxe de dépaquetage d’un itérable avec * permet d’insérer les clés d’un dictionnaire dans une liste : [*state_capitals]. La PEP 448 a généralisé le dépaquetage dans Python 3.5 ; cette indication de compatibilité historique repose sur la spécification de la syntaxe, sans supposer une exécution de l’exemple sous Python 3.5. Le dépaquetage fonctionne aussi pour créer un tuple ou un ensemble.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys_list = [*state_capitals]
keys_tuple = (*state_capitals,)
keys_set = {*state_capitals}
print(keys_list)
print(keys_tuple)
print(sorted(keys_set))
['California', 'Pennsylvania', 'Texas']
('California', 'Pennsylvania', 'Texas')
['California', 'Pennsylvania', 'Texas']

L’ensemble élimine les doublons et ne garantit aucun ordre d’affichage ; sorted() rend le résultat affiché prévisible. Depuis Python 3.7, le tuple et la liste conservent l’ordre dans lequel le dictionnaire est parcouru. Choisissez la forme entre crochets si le résultat doit réellement être une liste.

Comparer les performances d’exécution

Si la vitesse de conversion compte dans votre programme, mesurez-la avec votre interpréteur Python et un dictionnaire de taille comparable à vos données. Le script suivant affiche la version de Python et le meilleur temps de cinq essais, chacun effectuant 10 000 conversions du même dictionnaire de 100 entrées. Chaque instruction chronométrée crée une nouvelle liste ; dans le cas de la boucle, une liste de destination neuve est créée à chaque conversion.

import platform
from timeit import repeat

state_capitals = {str(number): number for number in range(100)}
methods = {
    "list(d.keys())": "list(state_capitals.keys())",
    "list(d)": "list(state_capitals)",
    "loop": "keys = []\nfor key in state_capitals:\n    keys.append(key)",
    "comprehension": "[key for key in state_capitals]",
    "unpacking": "[*state_capitals]",
}

print("Python", platform.python_version())
for name, statement in methods.items():
    times = repeat(statement, globals=globals(), number=10_000, repeat=5)
    print(f"{name}: {min(times) / 10_000:.9f} seconds per conversion")

Les temps affichés dépendent de l’interpréteur, de la machine et de la taille du dictionnaire : il n’y a donc ni résultat chiffré fixe ni méthode toujours la plus rapide. Dans le code courant, privilégiez list(state_capitals) pour sa clarté ; comparez les autres méthodes par mesure seulement si la conversion représente un coût notable dans votre programme.