web-dev-qa-db-fra.com

Ajouter un dictionnaire à une liste dans une boucle Python

Je suis un programmeur de base python donc j'espère que la réponse à ma question sera facile. J'essaie de prendre un dictionnaire et de l'ajouter à une liste. Le dictionnaire change ensuite les valeurs, puis est à nouveau ajouté en boucle. Il semble que chaque fois que je fais cela, tous les dictionnaires de la liste changent leurs valeurs pour correspondre à celui qui vient d'être ajouté. Par exemple:

>>> dict = {}
>>> list = []
>>> for x in range(0,100):
...     dict[1] = x
...     list.append(dict)
... 
>>> print list

Je suppose que le résultat serait [{1:1}, {1:2}, {1:3}... {1:98}, {1:99}] mais j'ai eu:

[{1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}]

Toute aide est grandement appréciée.

27
Acoop

Vous devez ajouter un copie, sinon vous ajoutez simplement des références au même dictionnaire encore et encore:

yourlist.append(yourdict.copy())

J'ai utilisé yourdict et yourlist au lieu de dict et list; vous ne voulez pas masquer les types intégrés.

51
Martijn Pieters

Mettez simplement dict = {} à l'intérieur de la boucle.

>>> dict = {}
>>> list = []
>>> for x in range(0, 100):
       dict[1] = x
       list.append(dict)
       dict = {}

>>> print list
4
docjag

Lorsque vous créez le dictionnaire adict en dehors de la boucle, vous ajoutez le même dict à votre liste alist. Cela signifie que toutes les copies pointent vers le même dictionnaire et que vous obtenez la dernière valeur {1:99} à chaque fois. Créez simplement chaque dictionnaire dans la boucle et maintenant vous avez vos 100 dictionnaires différents.

alist = []
for x in range(100):
    adict = {1:x}
    alist.append(adict)
print(alist)
4
chapelo

Vous pouvez également utiliser Zip et comprendre la liste pour faire ce dont vous avez besoin.

Si vous voulez que les valeurs dict commencent par une seule fois, utilisez range(1,100)

l = [dict(Zip([1],[x])) for x in range(1,100)]
2