Python >> Tutoriel Python >  >> Python

Comment créer une liste de dictionnaires en Python ?

Problème :Dites, vous avez un dictionnaire {0: 'Alice', 1: 'Bob'} et vous voulez créer une liste de dictionnaires avec des copies du dictionnaire original :[{0: 'Alice', 1: 'Bob'}, {0: 'Alice', 1: 'Bob'}, {0: 'Alice', 1: 'Bob'}] .

d = {0: 'Alice', 1: 'Bob'}

dicts = [{**d} for _ in range(3)]
print(dicts)
# [{0: 'Alice', 1: 'Bob'}, {0: 'Alice', 1: 'Bob'}, {0: 'Alice', 1: 'Bob'}]

Vous utilisez la compréhension de liste avec une variable de boucle "jetable" trait de soulignement _ pour créer une liste de 3 éléments. Vous pouvez changer la valeur 3 si vous avez besoin de plus ou moins d'éléments dans votre liste.

L'expression {**d} décompresse toutes les paires (clé, valeur) du dictionnaire d'origine d dans un nouveau dictionnaire. Pour plus d'informations sur l'opérateur de décompression, consultez ce tutoriel de blog Finxter.

La liste résultante contient des copies du dictionnaire original. Si vous en modifiez un, les autres ne verront pas ce changement :

dicts[0][2] = 'Frank'
print(dicts)
# [{0: 'Alice', 1: 'Bob', 2: 'Frank'}, {0: 'Alice', 1: 'Bob'}, {0: 'Alice', 1: 'Bob'}]

Seul le premier dictionnaire de la liste contient la nouvelle paire clé-valeur (2: 'Frank') ce qui prouve que les dictionnaires ne pointent pas sur le même objet en mémoire. Ce serait le cas si vous utilisiez la méthode suivante pour copier une liste avec un seul dictionnaire :

d2 = {0: 'Alice', 1: 'Bob'}

dicts2 = [d2] * 3
print(dicts2)
# [{0: 'Alice', 1: 'Bob'}, {0: 'Alice', 1: 'Bob'}, {0: 'Alice', 1: 'Bob'}]

La méthode semble correcte, mais les trois dictionnaires sont essentiellement les mêmes :

dicts2[0][2] = 'Frank'
print(dicts2)
# [{0: 'Alice', 1: 'Bob', 2: 'Frank'}, {0: 'Alice', 1: 'Bob', 2: 'Frank'}, {0: 'Alice', 1: 'Bob', 2: 'Frank'}]

Si vous en changez un, vous changez tout.

Vous pouvez voir cet effet vous-même dans l'outil de visualisation de mémoire suivant :

Exercice :remplacez la méthode par la bonne pour que le changement n'affecte que le premier dictionnaire !

Articles connexes :Comment créer une liste Python ?