Python语句未按顺序执行?

时间:2019-04-12 03:15:02

标签: python dictionary

我有以下三个列表:

d1 = [{"Names": ["Chris","Sam","Max"], "Color": "Blue"},{"Names": ["Albert","Robert","Julie"], "Color": "Red"}] 
d2 = [{"SomeNames": ["April","John","Erin"], "Color": "Green"},{"SomeNames": ["Phillip","Nate","Wendy"], "Color": "Yellow"}]
d3 = [{"Color": "Pink"}, {"Color": "Purple"}, {"Color": "Orange"}]

如果我运行代码:

for item in d2:
    item["Names"]=item.pop("SomeNames")
    d1.append(item)

print(d1)

我得到:

[{'Names': ['Chris', 'Sam', 'Max'], 'Color': 'Blue'}, {'Names': ['Albert', 'Robert', 'Julie'], 'Color': 'Red'}, {'Names': ['April', 'John', 'Erin'], 'Color': 'Green'}, {'Names': ['Phillip', 'Nate', 'Wendy'], 'Color': 'Yellow'}]

如果我运行代码:

for item in d2:
    item.pop("SomeNames")
    d3.append(item)

我得到:

[{'Color': 'Pink'}, {'Color': 'Purple'}, {'Color': 'Orange'}, {'Color': 'Green'}, {'Color': 'Yellow'}]

到目前为止,一切都很好。但是,如果我尝试将它们合并到同一循环中:

for item in d2:

    item["Names"]=item.pop("SomeNames")
    d1.append(item)

    item.pop("Names")
    d3.append(item)

print(d1)
print(d3)

我得到:

[{'Names': ['Chris', 'Sam', 'Max'], 'Color': 'Blue'}, {'Names': ['Albert', 'Robert', 'Julie'], 'Color': 'Red'}, {'Color': 'Green'}, {'Color': 'Yellow'}]
[{'Color': 'Pink'}, {'Color': 'Purple'}, {'Color': 'Orange'}, {'Color': 'Green'}, {'Color': 'Yellow'}]

这意味着我以某种方式接连执行两个命令时会丢失以下列表项:

{'Names': ['April', 'John', 'Erin']}
{'Names': ['Phillip', 'Nate', 'Wendy']}

期望得到:

[{'Names': ['Chris', 'Sam', 'Max'], 'Color': 'Blue'}, {'Names': ['Albert', 'Robert', 'Julie'], 'Color': 'Red'}, {'Names': ['April', 'John', 'Erin'], 'Color': 'Green'}, {'Names': ['Phillip', 'Nate', 'Wendy'], 'Color': 'Yellow'}]
[{'Color': 'Pink'}, {'Color': 'Purple'}, {'Color': 'Orange'}, {'Color': 'Green'}, {'Color': 'Yellow'}]

那些弹出命令不是应该在循环中顺序执行吗?我不明白为什么会这样?

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为@moreON是正确的,如果您想重用dict,但要在一处更改它,则必须克隆它或创建一个新的。

创建新的字典版本:

for item in d2:
    item["Names"] = item.pop("SomeNames")
    d1.append(item)

    d3.append({'Color': item['Color']})

复制字典版本:

for item in d2:
    item["Names"] = item.pop("SomeNames")
    d1.append(item)

    new_item = dict(item)
    new_item.pop('Names')
    d3.append(new_item)

还没有找到更好的方法。

答案 1 :(得分:2)

这是执行此操作的另一种方法:

for dic in d2:
    d1.append({k.replace('SomeNames', 'Names'):v for k,v in dic.items()})
    d3.append({'Color': dic['Color']})