我遇到的代码未能达到我的期望。详细信息如下:
a = ['name']
b = [('name=cheng',),('name=huang',),('name=pan',)]
Dict = {}
c = []
for i in range(0,3):
for j in range(0,1):
Dict[a[j]] = b[i][j]
c.append(Dict)
print(c)
>>> [{'name':'name=pan'},{'name':'name=pan'},{'name':'name=pan'}]
i
应该是什么
>>> [{'name':'name=cheng'},{'name':'name=huang'},{'name':'name=pan'}]
那么您能告诉我如何解决此问题吗?
答案 0 :(得分:5)
您要在原位置更改Dict
的值,而不是每次都不创建新的字典。循环的每次迭代,都将Dict["name"]
设置为等于b
中的元素之一,然后将其附加到列表中。循环的下一次迭代将更改dict(意味着您附加到c的先前版本也将被更改)。结果是您的列表c
填充了在循环的最后一次迭代中创建的字典的3个精确副本(在内存中完全相同的位置)。
您如何解决此问题?每次都制作一本新字典。
a = ['name']
b = [('name=cheng',),('name=huang',),('name=pan',)]
c = []
for i in range(0,3):
for j in range(0,1):
temp_dict = {a[j]: b[i][j]}
c.append(temp_dict)
print(c)
结果:
[{'name': 'name=cheng'}, {'name': 'name=huang'}, {'name': 'name=pan'}]
答案 1 :(得分:1)
对于循环的所有迭代,您都使用Dict
的相同值。因此,所有词典都是相同的。列表中只有三本相同词典的副本。
如果将Dict = {}
语句移入循环,它将得到修复。
a = ['name']
b = [('name=cheng',),('name=huang',),('name=pan',)]
c = []
for i in range(0,3):
Dict = {}
for j in range(0,1):
Dict[a[j]] = b[i][j]
c.append(Dict)
print(c)
或更多Pythonic:
keys = ['name']
values_list = [('name=cheng',), ('name=huang',), ('name=pan',)]
result = []
for values in values_list:
result.append(dict(zip(keys, values)))
print(result)
这可以通过使用zip
内置函数来完成,而该函数与[(x[i], y[i]) for i in range(min(len(x), len(y))]
的作用相同,而无需跟踪索引或长度。
dict
类可以从元组列表构建字典,这是此解决方案使用的方法。