I have this list of dictionary:
MylistOfdict = [{\'Word\': \'surveillance\',
\'Word No\': 1},
{\'Word\': \'equivocal\',
\'Word No\': 2}]
When you append a dictionary to a list, a reference to the original object itself is appended. So, you are currently just modifying the existing object's keys and values in each iteration of the inner loop, so the last written value is the only thing which persists.
To do what you require, you would need to create a new dictionary object in each iteration of the inner loop. For the shown dictionaries in MylistOfdict, a simple dictionary comprehension would work. But if you have more complex dictionaries, use the copy module's deepcopy method.
MylistOfdict = [{'Word': 'surveillance', 'Word No': 1},
{'Word': 'equivocal', 'Word No': 2}]
word_db2 = []
key = 1
for i in MylistOfdict:
for j in range(1, 4):
# Creating a new dictionary object and copying keys and values from i
new_dict = {k: v for k, v in i.items()}
new_dict['Card Type'] = 'Type '+str(j)
new_dict['Card Key'] = key
print(new_dict)
word_db2.append(new_dict)
key += 1
Let's review the loop body logic step by step:
So the key point you missed is that you modify and append the same object that was selected on the first step. And at the end of the snippet word_db2
contains six object refs, but only two unique. As a result, the output shows similar rows.
You can make a shallow copy of a dict before modifying and appending it:
for j in range(1, 4):
i = dict(i)
i['Card Type'] = 'Type '+str(j)
i['Card Key'] = key
print(i)
word_db2.append(i)
key += 1
As further note, if the dict contains other mutable objects like nested dicts, you should make a deep copy:
import copy
old_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
new_dict = copy.deepcopy(old_dict)
old_dict['a'][1] = 7
new_dict['a'][1] # 2
Don't use the same dict, make copies of them:
word_db2 = []
key = 1
for i in MylistOfdict:
for j in range(1, 4):
i = dict(i)
i['Card Type'] = 'Type '+str(j)
i['Card Key'] = key
print(i)
word_db2.append(i)
key += 1
Use deepcopy. What's happening is that your append call is just appending a reference to the original object.
from copy import deepcopy
my_list_of_dict = [{'Word': 'surveillance',
'Word No': 1},
{'Word': 'equivocal',
'Word No': 2}]
word_db2 = []
key = 1
for i in my_list_of_dict:
for j in range(1, 4):
i['Card Type'] = 'Type ' + str(j)
i['Card Key'] = key
print(i)
word_db2.append(deepcopy(i))
key += 1
for i in word_db2:
print(i)