【问题标题】:How can i get the difference between 2 dictionaries in another dictionary?我怎样才能得到另一个字典中的两个字典之间的区别?
【发布时间】:2018-02-02 07:39:22
【问题描述】:

我有 2 部本应完全相同的字典,但有一点差异,大约 0.0035%,但考虑到我的数据数量,这仍然是相当多的元素。

我想要的是在第 3 部词典中获得 2 部词典之间的差异,例如:

mydict = {
    'a': [[2,4], [5,6]],
    'b': [[1,1], [1,7,9], [6,2,3]],
    'c': [['a'], [4,5]],
}

second_dict = {'a': [[2,4]],
        'b': [[1,1], [1,7,9], [6,2,3]],

    }

让我们假设mydict 是包含所有元素的基本事实,second_dict 是缺少一些元素,diff_dict 应该是:

 diff_dict = {'a': [[5,6]],
            'c': [['a'], [4,5]],    
        }

【问题讨论】:

  • 到目前为止你尝试过什么?这个想法可能是遍历mydict 的所有键并检查它们是否存在于second_dict 中。如果有,则需要比较这些值(它们总是数字列表的列表吗?)
  • Python dicts 可能不是保存大量数据的最佳方式,计算差异会相对昂贵。您是否在使用其他库,例如 Pandas 或 Numpy?如果是这样,请编辑您的问题,也许您可​​能会得到更高效的答案。
  • 我试过但没用的value = {k: my_dict[k] for k in set(my_dict) - set(plus_min_dict)}
  • “差异”是什么意思?只是钥匙?或者是否也有可能存在一个键但具有不同的值?

标签: python python-3.x dictionary


【解决方案1】:
>>> diff_dict = {k:[x for x in v if x not in second_dict.get(k, [])] for k,v in mydict.items()}
>>> diff_dict
{'c': [['a'], [4, 5]], 'a': [[5, 6]], 'b': []}
>>> diff_dict = {k:v for k,v in diff_dict.items() if v}
>>> diff_dict
{'c': [['a'], [4, 5]], 'a': [[5, 6]]}

我建议将 mydictsecond_dict 中的值设置为集合,而不是列表以提高效率和更简洁的代码。

【讨论】:

  • 没有在我的数据集上工作,在 second_dict 中存在许多差异项目。
  • 请提供您遇到问题的更多详细信息?
【解决方案2】:

这可行,但效率不高,因为它为mydict 中的每个条目重复second_dict.get()

mydict = {
    'a': [[2,4], [5,6]],
    'b': [[1,1], [1,7,9], [6,2,3]],
    'c': [['a'], [4,5]],
}
second_dict = {
    'a': [[2,4]],
    'b': [[1,1], [1,7,9], [6,2,3]],
}
diff_dict = {
    k: [v for v in vals if v not in second_dict.get(k, [])]
    for k, vals in mydict.items()
}
# only keep non-empty lists
diff_dict = {k: v for k, v in diff_dict.items() if v}
diff_dict
# {'a': [[5, 6]], 'c': [['a'], [4, 5]]}

这更难阅读,但效率更高:

diff_dict = {
    k: (
        [v for v in vals if v not in second_dict[k]] if k in second_dict 
        else vals
    ) 
    for k, vals in mydict.items()
}
diff_dict = {k: v for k, v in diff_dict.items() if v}

如果您愿意将项目保存在元组集合而不是列表列表中,您可以更轻松有效地做到这一点:

mydict = {
    'a': {(2,4), (5,6)},
    'b': {(1,1), (1,7,9), (6,2,3)},
    'c': {('a',), (4,5)},
}
second_dict = {
    'a': {(2,4)},
    'b': {(1,1), (1,7,9), (6,2,3)},
}
diff_dict = {key: full - second_dict.get(key, set()) for key, full in mydict.items()}
diff_dict
# {'a': set([(5, 6)]), 'c': set([(4, 5), ('a',)]), 'b': set([])}

【讨论】:

  • 没有在我的数据集上工作,在 second_dict 中存在许多差异项目。
  • 哪个版本没用? (大概是第一个?)你能举一个不可行的例子吗?
猜你喜欢
  • 2014-08-22
  • 2014-08-27
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多