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

问题:

假设我有两个Python字典 – dictAdictB。我需要找出是否存在dictB但不在dictA中存在的任何键。最快的方式是什么?
我应该将字典键转换成一组,然后再去吗?
有兴趣了解你的想法…
感谢您的回应。
道歉,不正确地说明我的问题。
我的场景是这样的 – 我有一个dictA可以与dictB相同,或者与dictB相比可能有一些键丢失,否则一些键的值可能不同,必须设置为的dictA键值。
问题是字典没有标准,可以具有可以被称为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’必须在dict中添加。
键值没有固定的格式。它可以是一个简单的价值,或者是dict或者dict的dict。

回答:

您可以使用键上的设置操作:

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

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Calculate difference in keys contained in two Python dictionaries

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 3 = 2