我有两个代表两个表行的字典列表,所以:
tableA = [{"id": 1, "name": "foo"}, {"id": 2, "name": "bar"}]
tableB = [{"id": 1, "name": "bar"}, {"id": 3, "name": "baz"}]
我希望通过以下方式获得差异:
added = [{"id": 3, "name": "baz"}]
updated = [{"id": 1, "name": "bar"}]
我知道,id
是唯一的。
所以,我打算循环tableB
,询问id
,如果它们相等,则比较dicts以确定它是否为updated
,如果不是,则{新的,它是added
。
for x in tableA:
idexists = false
for y in tableY:
if x["id"] == y["id"]:
if x != y:
updated.append(x)
idexists = true
if not idexists:
added.append(x)
这是对的吗?可以用pythonic方式完成吗?
答案 0 :(得分:2)
我会将表格重组,形成更为方便的id
:name
词典,然后是diff:
from deepdiff import DeepDiff
tableA = [{"id": 1, "name": "foo"}, {"id": 2, "name": "bar"}]
tableB = [{"id": 1, "name": "bar"}, {"id": 3, "name": "baz"}]
tableA = {item["id"]: item["name"] for item in tableA}
tableB = {item["id"]: item["name"] for item in tableB}
print(DeepDiff(tableA, tableB))
打印:
{
'dictionary_item_added': {'root[3]'},
'dictionary_item_removed': {'root[2]'},
'values_changed': {
'root[1]': {
'old_value': 'foo',
'new_value': 'bar'
}
}
}
用于计算使用deepDiff
模块建议here的差异,但您可以使用链接线程中的任何建议解决方案。
另一个想法可能是将字典列表转换为pandas.DataFrame
然后差异: