gpt4 book ai didi

python - 计算两个 Python 字典中包含的键的差异

转载 作者:IT老高 更新时间:2023-10-28 12:23:36 26 4
gpt4 key购买 nike

假设我有两个 Python 字典 - dictAdictB。我需要找出 dictB 中是否存在任何键,但 dictA 中是否存在键。最快的方法是什么?

我应该把字典键转换成一个集合然后继续吗?

有兴趣了解你的想法……


感谢您的回复。

很抱歉没有正确地陈述我的问题。我的场景是这样的 - 我有一个 dictA 可以与 dictB 相同,或者与 dictB 相比可能缺少一些键,否则某些键的值可能不同,必须设置为 dictA 键的值。

问题是字典没有标准,可以有可以是dict的dict的值。

dictA={'key1':a, 'key2':b, 'key3':{'key11':cc, 'key12':dd}, 'key4':{'key111':{....}}}
dictB={'key1':a, 'key2:':newb, 'key3':{'key11':cc, 'key12':newdd, 'key13':ee}.......

所以'key2'值必须重置为新值,'key13'必须添加到字典中。键值没有固定格式。它可以是一个简单的值,也可以是一个字典或字典的字典。

最佳答案

您可以对键使用 set 操作:

diff = set(dictb.keys()) - set(dicta.keys())

这是一个查找所有可能性的类:添加了什么,删除了什么,哪些键值对是相同的,哪些键值对改变了。

class DictDiffer(object):
"""
Calculate the difference between two dictionaries as:
(1) items added
(2) items removed
(3) keys same in both but changed values
(4) keys same in both and unchanged values
"""
def __init__(self, current_dict, past_dict):
self.current_dict, self.past_dict = current_dict, past_dict
self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys())
self.intersect = self.set_current.intersection(self.set_past)
def added(self):
return self.set_current - self.intersect
def removed(self):
return self.set_past - self.intersect
def changed(self):
return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o])
def unchanged(self):
return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])

这是一些示例输出:

>>> a = {'a': 1, 'b': 1, 'c': 0}
>>> b = {'a': 1, 'b': 2, 'd': 0}
>>> d = DictDiffer(b, a)
>>> print "Added:", d.added()
Added: set(['d'])
>>> print "Removed:", d.removed()
Removed: set(['c'])
>>> print "Changed:", d.changed()
Changed: set(['b'])
>>> print "Unchanged:", d.unchanged()
Unchanged: set(['a'])

作为 github 存储库提供: https://github.com/hughdbrown/dictdiffer

关于python - 计算两个 Python 字典中包含的键的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1165352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com