Acoop
Acoop

Reputation: 2666

Appending a dictionary to a list in a loop

I am trying to take a dictionary and append it to a list. The dictionary then changes values and then is appended again in a loop. It seems that every time I do this, all the dictionaries in the list change their values to match the one that was just appended.

For example:

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

I would assume the result would be [{1:1}, {1:2}, {1:3}... {1:98}, {1:99}] but instead I got:

[{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}]

Upvotes: 68

Views: 107898

Answers (5)

iNikkz
iNikkz

Reputation: 3819

Let's say d is your dictionary. Here, if you do d.copy(). It returns shallow copy that doesn't work when you have nested dictionary into d dictionary. To overcome from this issue, we have to use deepcopy.

from copy import deepcopy
list.append(deepcopy(d))

It works perfectly !!!

Upvotes: 2

docjag
docjag

Reputation: 429

Just put dict = {} inside the loop.

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

>>> print list

Upvotes: 11

Martijn Pieters
Martijn Pieters

Reputation: 1121486

You need to append a copy, otherwise you are just adding references to the same dictionary over and over again:

yourlist.append(yourdict.copy())

I used yourdict and yourlist instead of dict and list; you don't want to mask the built-in types.

Upvotes: 99

chapelo
chapelo

Reputation: 2562

When you create the adict dictionary outside of the loop, you are appending the same dict to your alist list. It means that all the copies point to the same dictionary and you are getting the last value {1:99} every time. Just create every dictionary inside the loop and now you have your 100 different dictionaries.

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

Upvotes: 16

Padraic Cunningham
Padraic Cunningham

Reputation: 180391

You can also use zip and list comprehension to do what you need.

If you want the dict values to start at one use range(1,100)

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

Upvotes: 6

Related Questions