2 votes

Comment modifier la valeur d'un dictionnaire Python et créer la liste des dictionnaires ?

Je veux modifier un dictionnaire et créer une liste qui contient les dictionnaires avec les valeurs modifiées. J'ai essayé :

mylist = []
mydict = {"one": 10, "two": 20, "three": 30}
for i in [111, 222, 333]:
   mydict["two"] = i
   mylist.append(mydict)

ma liste de retours :

[{'three': 30, 'two': 333, 'one': 10}, {'three': 30, 'two': 333, 'one': 10},  {'three': 30, 'two': 333, 'one': 10}]

Je m'attends à recevoir :

[{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10},  {'three': 30, 'two': 333, 'one': 10}]

Comment puis-je le faire ?

4voto

Kasramvd Points 32864

C'est parce que vous créez simplement des références multiples au même objet (votre dictionnaire) et en assignant la variable jetable i à vos clés qui détient 333 à la dernière itération et l'assigner à la clé two tous les noms de votre dictionnaire pointeront vers le même objet avec l'élément ('two', 333) .

Vous pouvez utiliser une dictée de compréhension pour vous débarrasser de ce problème :

>>> mylist = [{"one": 10, "two": i, "three": 30} for i in [111, 222, 333]]
>>> mylist
[{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}]

Vous pouvez également créer une copie de votre objet initial à chaque itération afin de créer un nouvel objet plutôt que de simplement copier les références.

>>> from copy import copy
>>> mylist = []
>>> mydict = {"one": 10, "two": 20, "three": 30}
>>> for i in [111, 222, 333]:
...    mydict["two"] = i
...    mylist.append(copy(mydict))
... 
>>> mylist
[{'one': 10, 'three': 30, 'two': 111}, {'one': 10, 'three': 30, 'two': 222}, {'one': 10, 'three': 30, 'two': 333}]

Et si vous avez plusieurs touches que vous voulez modifier, vous pouvez le faire comme une approche plus pythique :

>>> for i, j in zip(my_keys, my_new_values):
...    mydict[i] = j
...    mylist.append(copy(mydict))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X