python - 比较 Python 字典和嵌套字典

标签 python dictionary comparison

我知道那里有几个类似的问题,但我的问题完全不同并且对我来说很难。 我有两个字典:

d1 = {'a': {'b': {'cs': 10}, 'd': {'cs': 20}}}
d2 = {'a': {'b': {'cs': 30}, 'd': {'cs': 20}}, 'newa': {'q': {'cs': 50}}}

d1 有键 'a'd2 有键 'a''newa'(换句话说,d1 是我的旧字典,d2 是我的新字典)。

我想遍历这些字典,如果键相同,检查它的值(嵌套字典),例如当我在 d2 中找到键 'a' 时,我将检查是否有 'b',如果有则检查 ' 的值cs'(从 10 更改为 30),如果此值更改,我想打印它。

还有一种情况,我想从d2中获取'newa'作为新添加的key。

因此,在遍历这 2 个字典后,这是预期的输出:

"d2" has new key "newa"
Value of "cs" is changed from 10 to 30 of key "b" which is of key "a"

我有以下代码,我正在尝试许多循环,但这些循环不起作用,但也不是一个好的选择,因此我正在寻找是否可以通过一段递归代码获得预期的输出。

for k, v in d1.iteritems():
    for k1, v1 in d2.iteritems():
        if k is k1:
            print k
            for k2 in v:
                for k3 in v1:
                    if k2 is k3:
                        print k2, "sub key matched"

        else:
            print "sorry no match found"

最佳答案

使用递归比较 2 个字典:

为 python 3 编辑(也适用于 python 2):

d1= {'a':{'b':{'cs':10},'d':{'cs':20}}}
d2= {'a':{'b':{'cs':30} ,'d':{'cs':20}},'newa':{'q':{'cs':50}}}

def findDiff(d1, d2, path=""):
    for k in d1:
        if k in d2:
            if type(d1[k]) is dict:
                findDiff(d1[k],d2[k], "%s -> %s" % (path, k) if path else k)
            if d1[k] != d2[k]:
                result = [ "%s: " % path, " - %s : %s" % (k, d1[k]) , " + %s : %s" % (k, d2[k])]
                print("\n".join(result))
        else:
            print ("%s%s as key not in d2\n" % ("%s: " % path if path else "", k))

print("comparing d1 to d2:")
findDiff(d1,d2)
print("comparing d2 to d1:")
findDiff(d2,d1)

Python 2 旧答案:

def findDiff(d1, d2, path=""):
    for k in d1:
        if (k not in d2):
            print (path, ":")
            print (k + " as key not in d2", "\n")
        else:
            if type(d1[k]) is dict:
                if path == "":
                    path = k
                else:
                    path = path + "->" + k
                findDiff(d1[k],d2[k], path)
            else:
                if d1[k] != d2[k]:
                    print (path, ":")
                    print (" - ", k," : ", d1[k])
                    print (" + ", k," : ", d2[k])

输出:

comparing d1 to d2:
a -> b: 
 - cs : 10
 + cs : 30
comparing d2 to d1:
a -> b: 
 - cs : 30
 + cs : 10

关于python - 比较 Python 字典和嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27265939/

相关文章:

python - 有没有办法在 Python 中定义 float 组?

c# - 将 XML 文档转换为字典

python - 为什么给字典的键 `True` 赋值会覆盖同一字典中键 `1` 的值?

algorithm - 挑战 : Find the unique value in an array of even or odds numbers

c# - 如何区分同一对象的两个版本?

python - 使用潜在语义分析进行聚类

python ObjectListView 有一个不可编辑的列

python - 如何测试基于 appengine/drive/google api 的应用程序?

python - 从词典列表到词典

c# - 比较 XML 节点的高效算法