Iam trying to create a list of dictionaries, but seems to me, that i am doing something wrong:
So, I have a list of tuples, something like this:
dict = {}
lst = []
cats = [(u'cat1', u'Matilda'),(u'cat2', u'Mew')]
for line in cats:
dict['cat_num'] = line[0]
dict['name'] = line[1]
lst.append(dict)
print lst
As a result I am getting this list:
[{'cat_num': u'cat2', 'name': u'Mew'}, {'cat_num': u'cat2', 'name': u'Mew'}]
Can anyone tell me where is my mistake?
Thank you.
Move the definition of dct
inside the loop (and don't call it dict
, since this is the name of the class):
lst = []
cats = [(u'cat1', u'Matilda'),(u'cat2', u'Mew')]
for line in cats:
dct = {}
dct['cat_num'] = line[0]
dct['name'] = line[1]
lst.append(dct)
print lst
Remember that dict()
is actually a builtin Python function that builds dictionaries, so it is probably not a good idea to rename it. Why not do something like,
cats = [(u'cat1', u'Matilda'),(u'cat2', u'Mew')]
lst = [dict(cat_num=c,name=n) for c,n in cats]
First you need to create a dictionary for every tuple. Before you were using only one, shared dictionary:
lst = []
cats = [(u'cat1', u'Matilda'),(u'cat2', u'Mew')]
for line in cats:
d = {}
d['cat_num'] = line[0]
d['name'] = line[1]
lst.append(d)
print lst
Since dict
has already been created you are appending a reference
to the dictionary to the array ( lst
) and altering it for every line in cats
.
To see this, simply print
your dictionary for each iteration:
tmp = {}
final_results = []
cats = [(u'cat1', u'Matilda'),(u'cat2', u'Mew')]
for line in cats:
tmp['cat_num'] = line[0]
tmp['name'] = line[1]
print "For", line, "the dictionary is", tmp
final_results.append(dict)
print "The final list is:", final_results
All you need to do is create a new dictionary each time, and your problems will be solved:
final_results = []
cats = [(u'cat1', u'Matilda'),(u'cat2', u'Mew')]
for line in cats:
final_results.append( \
{'cat_num': line[0],
'name': line[1]} \
)
SEE ALSO: "Least Astonishment" and the Mutable Default Argument for other places where this behavior might surprise you.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.