我有这个:
[{'name': 'Peter'}, {'name': 'Anna'}]
我想用它做出这个:
[{'name': 'Peter Williams'}, {'name': 'Anna Williams'}]
所以我做了:
>>> li = [{'name': 'Peter'}, {'name': 'Anna'}]
>>> new_li = []
>>> dic = {}
>>> for i in li:
... dic["name"] = i["name"] + " Williams"
... new_li.append(dic)
但是:
>>> new_li
[{'name': 'Anna Williams'}, {'name': 'Anna Williams'}]
为什么呢?
您是否还可以了解如何最好地获取[{'name': 'Peter Williams'}, {'name': 'Anna Williams'}]
?
修改
我之所以不理解这种行为是因为我认为:
>>> dict = {'name':'Peter'}
>>> lis = [dict]
>>> dict['name'] = 'Olaf'
哪里
>>> print lis
给出
[{'name': 'Peter'}]
虽然它实际上是
[{'name': 'Olaf'}]
答案 0 :(得分:2)
因为你在每次迭代中都使用相同的字典对象。
在第二次迭代中,您正在更改在上一次迭代中分配给name
键的值,并且您的列表最终包含对同一对象的两个引用。
我强烈建议您查看“Python Tutor”工具(pythontutor.com),该工具允许您可视化某些python代码的执行,并查看堆栈中正在创建的对象。例如Python Tutor with your code
正确的做法是:
li = [{'name': 'Peter'}, {'name': 'Anna'}]
new_li = []
for p in li:
new_p = {'name': p['name'] + ' Williams'}
new_li.append(new_p)
这样,每次迭代都会创建一个新的字典对象。
更简洁的解决方案:
li = [{'name': 'Peter'}, {'name': 'Anna'}]
new_li = [{'name': p['name'] + ' Williams'} for p in li]
答案 1 :(得分:0)
您需要在循环的每次迭代中创建一个新字典,否则在每次迭代时您修改并将同一个对象追加到new_li
:
>>> li = [{'name': 'Peter'}, {'name': 'Anna'}]
>>> new_li = []
>>> for i in li:
... new_li.append({'name': i['name'] + ' Williams'})
...
>>> new_li
[{'name': 'Peter Williams'}, {'name': 'Anna Williams'}]
答案 2 :(得分:0)
我假设您想要就地改变它。你不需要制作新的词典。
for d in inlist:
d["name"] += " Williams"
你需要做的就是。
答案 3 :(得分:0)
你遇到了一个非常讨厌的问题。问题出在您的dic
上。您正在遍历名称列表,首先您使用“Peter”进行搜索。此时,您将dic
设置为{'name': 'Peter Williams'}
并附加它。但是,你用“安娜”打了一个,然后将dic
更改为{'name': 'Anna Williams'}
。因此,您最终会在列表中使用相同的字典。要解决此问题,您需要改为:
new_li = []
for i in li:
n_li.append({'name': i['name'] + ' Williams'})