Python嵌套dict比较算法
我有一个比较两个python dict的程序,对于深度为1的非嵌套字典,它工作得非常好。算法非常简单:Python嵌套dict比较算法,python,algorithm,dictionary,nested,compare,Python,Algorithm,Dictionary,Nested,Compare,我有一个比较两个python dict的程序,对于深度为1的非嵌套字典,它工作得非常好。算法非常简单: for key in dict1, if not in dict2 print "-" key for key in dict2, if not in dict1 print "+" key for dict2Value, if not equal to dict1Value print "+" dict2value print "-" dict1value
for key in dict1, if not in dict2
print "-" key
for key in dict2, if not in dict1
print "+" key
for dict2Value, if not equal to dict1Value
print "+" dict2value
print "-" dict1value
正如我所说,它适用于深度为1且不嵌套的dict。我应该如何改变算法来处理嵌套和更深入的dict,我已经被困了一段时间了
我的代码:
def print_diff(dict1, dict2):
for n in dict1:
if n not in dict2:
print('- "' + str(n) + '":')
for n in dict2:
if n not in dict1:
print('+ "' + str(n) + '":')
continue
if dict2[n] != dict1[n]:
if type(dict2[n]) not in (dict, list):
print('- "' + str(n) + '" : "' + str(dict1[n]))
print('+ "' + str(n) + '" : "' + str(dict2[n]))
else:
if type(dict2[n]) == dict:
print_diff(dict1[n], dict2[n])
continue
return
下面采用了一种输出差异的较短形式(您可以根据自己的情况进行更改) 层次结构由输出中的开始/停止表示
>>> def dictdiff(d1, d2):
s1, s2 = set(d1), set(d2)
in1, in12, in2 = s1 - s2, s1 & s2, s2 - s1
if in1: print('Keys only in 1:', sorted(in1))
if in2: print('Keys only in 2:', sorted(in2))
sameval = {key for key in in12 if d1[key] == d2[key]}
if sameval: print('Keys with equal values:', sorted(sameval))
diffval = in12 - sameval
diffdict = {key for key in diffval if type(d1[key]) == type(d2[key]) == dict}
diffother = diffval - diffdict
if diffother: print('Keys with different values (that are not both dicts):', sorted(diffother))
for key in sorted(diffdict):
print('## START dictdiff for common key', key)
dictdiff(d1[key], d2[key])
print('## STOP dictdiff for common key', key)
>>> d1 = dict(a=1, b=2, c=dict(x=1, y=2), d=1, f=dict(s=1, t=3))
>>> d2 = dict(a=1, b=3, c=dict(x=1, y=2), e=1, f=dict(s=1, t=2))
>>> dictdiff(d1, d2)
Keys only in 1: ['d']
Keys only in 2: ['e']
Keys with equal values: ['a', 'c']
Keys with different values (that are not both dicts): ['b']
## START dictdiff for common key f
Keys with equal values: ['s']
Keys with different values (that are not both dicts): ['t']
## STOP dictdiff for common key f
>>>
最好记住以下几点:
>>> d1['c'] is d2['c']
False
>>> d1['c'] == d2['c']
True
>>>
使用递归比较两个字典:
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.keys():
if not d2.has_key(k):
print path, ":"
print "keys not in d2: " + k, "\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]
print "comparing d1 to d2:"
print findDiff(d1,d2)
print "comparing d2 to d1:"
print findDiff(d2,d1)
输出:
comparing d1 to d2:
a->b :
- cs : 10
+ cs : 30
None
comparing d2 to d1:
a->b :
- cs : 30
+ cs : 10
a :
keys not in d2: newa
None
你试过什么代码?dict1={'a':3,'b':{'b':4,'a':5}}和dict2={'a':{'a':3,'b':4},'a':5}的预期输出是什么?@Totem将我的代码添加到主位置,而不是删除你的问题,你可以考虑自己发布一个答案,然后把它标记为可以接受的。- 1请显示一个示例函数的用法。如果出现错误,请发布完整的回溯。这些是写一个好问题的基本信息。在没有进一步解释的情况下,你不应该使用“doeswork”或“notwork”。如果没有发布完整的回溯,你永远不应该说“它引发了一个错误”。不给学分的复制粘贴被否决