【问题标题】:Difference between tables表之间的差异
【发布时间】:2017-01-27 14:53:13
【问题描述】:

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

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,如果它们相等,然后比较字典以知道它是否是updated,如果不是,则id 是新的,它是@987654327 @。

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

【问题讨论】:

  • 我不清楚addedupdated 是如何计算的。

标签: python algorithm list dictionary set


【解决方案1】:

我会将表格重组为更方便的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,然后进行比较:

【讨论】:

  • 太棒了!但问题是,除了name 之外,还有更多的列,它会有效吗?因为桌子很大。 (现在我来看看 pandas)
  • @FacundoGFlores 请测量一下,如果您在大桌子上这样做会更有效。重构的最大优势是我们拥有id 的恒定时间查找。请注意,在这种情况下我们会失去顺序(假设它不重要)..
猜你喜欢
  • 2012-03-31
  • 2020-01-31
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 2021-10-21
相关资源
最近更新 更多