Python:通过key,value比较两个相同的字典

Python: Compare two identical dictionaries by key, value

我想比较两个字典的长度以及每个字典中的每个键值对。我还需要能够在查找的时候没有匹配的情况下打印出来。

我当前的代码似乎传递了长度标准,但在尝试匹配元素时失败了:

assert_that(len(model_dict), len(server_dict))
    for x in model_dict:
        if x not in server_dict and model_dict[x] != server_dict[x]:
            print(x, model_dict[x])

server_dict 字典中一个条目的示例:

{2847001: [[[-94.8, 28], [-95.4, 28], [-96, 28], [-96.5, 28.1], [-96.667, 28.133], [-97, 28.2], [-97.6, 28.3], [-98.3, 28.4], [-98.9, 28.6], [-99.4, 29], [-99.8, 29.5], [-100, 30], [-100.1, 30.5], [-100.2, 31]]]}

model_dict 字典中一个条目的示例:

{2847001: [[-94.8, 28], [-95.4, 28], [-96, 28], [-96.5, 28.1], [-96.667, 28.133], [-97, 28.2], [-97.6, 28.3], [-98.3, 28.4], [-98.9, 28.6], [-99.4, 29], [-99.8, 29.5], [-100, 30], [-100.1, 30.5], [-100.2, 31]]}

错误似乎是在 and 条件下的用法:

x not in server_dict and model_dict[x] != server_dict[x]

如果第一个条件通过,第二个条件就没有意义了。请尝试 or

x not in server_dict or model_dict[x] != server_dict[x] 

您需要 or,而不是 and。如果它不在 server_dict 中,您不想在那里检查它。

你做得太过分了,这就是错误。当你写这个

for x in model_dict:
    if x not in server_dict and model_dict[x] != server_dict[x]:
        print(x, model_dict[x])

对于 model_dict 中的每个键,您正在检查是否在 server_dict 中找不到相同的键,这本身就足够了。你在 and 之后所做的事情完全没有必要,也不正确,因为你试图将 model_dict 中的键值与 [=13= 中不存在的键值相匹配].

只需这样做:

{x: model_dict(x) for x in model_dict if x not in server_dict}

如果要检查每个键和值,可以使用 dict.items 和 dict.get 以及默认值:

for k,v  in model_dict.items():
       if server_dict.get(k,object()) != v:
            print(k,v)

如果你只是想要任何一个字典中不相同的键,你可以获得对称差异:

unique = model_dict.keys() ^ server_dict # viewkeys() python2