Python2.7-在比较字典时仅显示修改过的字典键/值

Python2.7-在比较字典时仅显示修改过的字典键/值,python,dictionary,Python,Dictionary,尝试使用此代码比较两个词典: 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

尝试使用此代码比较两个词典:

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:

工作,但不是当dicts有不同的键号,即

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"]}
不会显示添加的test10和test11

Dict也可以有更少的密钥,密钥也可以删除。我想也包括那个案子


非常感谢

您应该使用位异或(
^
)将列表与实际值进行比较:


您是否总是希望字典值是一个列表?在您的情况下,
d1\u keys==d2\u keys
,即['1iG5NDGVre',因此没有什么意外。@user1767754 Yes字典值将是一个列表。但是,其他JSON中的字典键/值可能多于第一个,反之亦然。在Yakym,我是Python新手,你能详细说明一下吗?
添加、删除、修改,same=dict_compare(一个['1iG5NDGVre',两个['1iG5NDGVre')
-你是在比较外部的1键dict,而不是内部的。。。。它们是相同的-相同的键,没有差异,只有一个键。投票以打字错误结束-另外:注意ref参数的比较,它们可能包含相同的数据,但ref不同-因此,虽然值可能比较相等,但您会得到“差异”-如果提供内部值,您仍然无法得到您想要的。因为您得到的是整个118值,而不仅仅是“蓝色”在188值列表中发生了更改,尝试了此操作,但得到了TypeError:unhabable type:'dict'。这是针对Python2.7的吗?我不知道您实际上是在比较
list
而不是
dict
。引发错误的原因是您在主
dict
中嵌套了
dict
/
列表
。查看我的答案以满足您的需要。如果您知道这是EXEXT结构(
one
->
dict
->
dict
->
list
列表),您可以使用类似于
的内容作为一个主键中的主键:一个[mainkey]中的子键:打印集(一个[mainkey][subkey])^set(两个[mainkey][subkey])
。其概念是,您使用答案中的代码来比较两个列表,您如何到达这些列表取决于包含它们的结构。当键号不同时,您希望得到什么?你会用什么来比较多余的钥匙?很好。现在不靠近电脑,稍后再检查
differences = set(one["1iG5NDGVre"]["118"]) ^ set(two["1iG5NDGVre"]["118"])
print differences