我试图创建一个字典列表,但在我看来,我做错了什么:
所以,我有一个元组列表,类似这样:
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
结果我得到了这个清单:
[{'cat_num': u'cat2', 'name': u'Mew'}, {'cat_num': u'cat2', 'name': u'Mew'}]
谁能告诉我我的错误在哪里?
谢谢。
答案 0 :(得分:5)
在循环中移动dct
的定义(并且不要将其称为dict
,因为这是类的名称):
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
答案 1 :(得分:4)
请记住,dict()
实际上是构建字典的内置Python函数,因此重命名它可能不是一个好主意。为什么不做类似的事情,
cats = [(u'cat1', u'Matilda'),(u'cat2', u'Mew')]
lst = [dict(cat_num=c,name=n) for c,n in cats]
答案 2 :(得分:1)
首先,您需要为每个元组创建一个字典。在您只使用一个共享字典之前:
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
答案 3 :(得分:0)
由于已经创建了dict
,因此您将reference
字典附加到数组(lst
)并为cats
中的每一行修改它。
要看到这一点,每次迭代只需print
字典:
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
您需要做的就是每次创建一个新词典,您的问题将得到解决:
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]} \
)
另请参阅: "Least Astonishment" and the Mutable Default Argument以了解此行为可能让您感到惊讶的其他地方。