表之间的差异

时间:2016-09-19 20:08:05

标签: python algorithm list dictionary set

我有两个代表两个表行的字典列表,所以:

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方式完成吗?

1 个答案:

答案 0 :(得分:2)

我会将表格重组,形成更为方便的idname词典,然后是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然后差异: