更改列表中具有相同键的字典值

时间:2012-11-02 23:07:20

标签: python dictionary for-loop

我有这个:

[{'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'}]

4 个答案:

答案 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'})