计算list-of-dicts之间的区别,返回带有新键的dict和旧值

时间:2018-01-23 18:31:08

标签: python python-3.x list dictionary nested

我想映射两个词典列表之间的差异。

我正在使用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}]

这样做的最佳方式是什么?

1 个答案:

答案 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中引入,支持 支持<但不支持3.5。< / p>