Python:按键,值比较两个相同的词典

时间:2015-11-14 18:00:24

标签: python dictionary matching

我想比较两个词典的长度以及每个词典中的每个键值对。我还需要能够在寻找时打印出来。

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

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]]}

4 个答案:

答案 0 :(得分:2)

错误似乎是在条件中使用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] 

答案 1 :(得分:1)

如果要检查每个键和值,可以使用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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你过度了,这就是错误。当你写这个

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中的密钥值与非{0}匹配server_dict中存在密钥的值。

这样做:

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