我有以下三个列表:
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'}]
那些弹出命令不是应该在循环中顺序执行吗?我不明白为什么会这样?
谢谢!
答案 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']})