1

我有这个:

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

4 回答 4

2

因为您在每次迭代中都使用相同的字典对象。

在第二次迭代中,您正在更改name在前一次迭代中分配给键的值,并且您的列表最终包含对同一对象的两个引用。

我强烈建议您查看“Python Tutor”工具 (pythontutor.com),它允许您可视化一些 Python 代码的执行,并查看堆栈中正在创建哪些对象。例如Python Tutor 与您的代码

做你想做的事情的正确方法是:

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]
于 2012-11-02T23:09:51.950 回答
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'}]
于 2012-11-02T23:11:03.357 回答
0

我假设你想就地改变它。你不需要做一个新的字典。

for d in inlist:
    d["name"] += " Williams"

是你所要做的。

于 2012-11-02T23:13:15.877 回答
0

你遇到了一个非常讨厌的问题。问题出在你的dic. 您正在遍历名称列表,首先您使用“Peter”点击名称列表。此时,您设置dic{'name': 'Peter Williams'}附加它。但是,你用'Anna'打了那个,然后把它dic改成{'name': 'Anna Williams'}. 因此,您最终会在列表中两次使用相同的字典。要解决此问题,您需要改为:

new_li = []
for i in li:
      n_li.append({'name': i['name'] + ' Williams'})
于 2012-11-02T23:13:41.520 回答