我想映射两个词典列表之间的差异。
我正在使用Python 3.5,并希望了解获取集之间差异的最佳方法。我知道set操作,但我不确定这是否是在我目前的情况下实现它们的最佳方式。
以下是我现在所拥有的:
orig = set()
chng = set()
original = [{"name": "Tom Pety", "name_id": 1}, {"name": "Tom Cruz", "name_id": 2}]
changed = [{"name": "Tom Petty"}, {"name": "Tom Cruise"}]
for item in original:
orig.update(item.values())
for item in changed:
chng.update(item.values())
diffs = orig - chng
我当前的输出是{'Tom Pety', 1, 2, 'Tom Cruz'}
。
最终,我希望得到一个看起来像这样的结果,以便更改的值与其id相关联:
[{"name": "Tom Petty", "name_id": 1}, {"name": "Tom Cruise", "name_id": 2}]
这样做的最佳方式是什么?
答案 0 :(得分:1)
如果列表具有相同的订单(这意味着changed
的第一个项必须首先应用于 > original
等项,然后我们可以使用zip
同时迭代列表,并使用dict.update
函数同时更新这些列表。像:
for orig, chang in zip(original, changed):
orig.update(chang)
之后,orig
列表将包含一个包含词典的列表:
>>> original
[{'name': 'Tom Petty', 'name_id': 1}, {'name': 'Tom Cruise', 'name_id': 2}]
请注意,我们更新词典,我们不构建新词典。如果我们需要创建新的,我们可以使用以下方法:
new_list = [ {**orig, **chang} for orig, chang in zip(original, changed) ]
词典的这种语法已在PEP-448中引入,python-2.x支持 ,python-3.x支持<但不支持3.5。< / p>