Ajouter un dictionnaire à une liste dans une boucle de Python

je suis un programmeur de base de python donc j'espère que la réponse à ma question sera facile. Je suis en train de prendre un dictionnaire et l'ajouter à une liste. Le dictionnaire change ensuite les valeurs puis est ajouté à nouveau dans une boucle. Il semble qu'à chaque fois que je fais cela, tous les dictionnaires de la liste changent leurs valeurs pour correspondre à celle qui vient d'être ajoutée. 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 au lieu de cela j'ai:

[{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 la grandement apprécié.

21
demandé sur Acoop 2014-05-18 20:20:25

4 réponses

Vous devez ajouter un copier, sinon vous êtes juste de l'ajout de références pour le 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 de masque de type intégré.

38
répondu Martijn Pieters 2014-05-18 17:35:07

quand vous créez le adict dictionnaire en dehors de la boucle, vous ajoutez la même dict pour votre alist liste. Cela signifie que toutes les copies pointent vers le même dictionnaire et vous obtenez la dernière valeur {1:99} à chaque fois. Il suffit de créer chaque dictionnaire à l'intérieur de 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
répondu chapelo 2014-05-18 16:47:39

vient de mettre dict = {} dans la boucle.

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

>>> print list
3
répondu docjag 2016-11-21 14:23:27

vous pouvez aussi utiliser zip et la compréhension de liste à faire ce que vous avez besoin.

si vous voulez que les valeurs de dict commencent à une utilisation range(1,100)

l = [dict(zip([1],[x])) for x in range(1,100)]
2
répondu Padraic Cunningham 2014-05-18 16:31:33