尝试使用以下代码比较两个字典:
def dict_compare(d1, d2):
d1_keys = set(d1.keys())
d2_keys = set(d2.keys())
intersect_keys = d1_keys.intersection(d2_keys)
added = d1_keys - d2_keys
removed = d2_keys - d1_keys
modified = {o: (d1[o], d2[o]) for o in intersect_keys if d1[o] != d2[o]}
same = set(o for o in intersect_keys if d1[o] == d2[o])
return added, removed, modified, same
one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]}}
added, removed, modified, same = dict_compare(one,two)
print added
print removed
print modified
print same
但是,它会错误地打印修改后的键/值。
输出:
set([])
set([])
{'1iG5NDGVre': ({'118': ['test1', 'test2', 'test3', 'tcp', '22', 'Red', '0.0.0.0/0']}, {'118': ['test1', 'test2', 'test3', 'tcp', '22', 'Red', 'Blue', '0.0.0.0/0']})}
set([])
任何想法如何纠正它?
我只想让它在修改后打印"蓝色"。
更新 1:
有效,但当字典具有不同的键号时不起作用,即
one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]},"119": ["test10","test11"]}
不会显示添加的测试10和测试11。
字典也可以有更少的键,键也可以删除。也想涵盖这种情况。
非常感谢!
您应该将列表与实际值进行比较,并按位排除或(^
(:
differences = set(one["1iG5NDGVre"]["118"]) ^ set(two["1iG5NDGVre"]["118"])
print differences