比较两个dicts并在python中打印不相等的值

时间:2016-10-24 07:53:15

标签: python dictionary key inequality

我需要将字典b与a进行比较,以检查b的键是否在。

如果有,请检查a[key]==b[key]的值。如果不相等则打印key:value对两个词典以供参考。我怎么能这样做?

a = {'key_1': 1,'key_2': 2, 'key_3': 3}
b = {'key_1': 1,'key_2': 5}

[k for key in b if key in a if b[k]!=a[k]]

我使用了上面的代码,但是无法像

一样打印字典键和值
not equal: b[key_2]=5 and a[key_2]=2

4 个答案:

答案 0 :(得分:1)

你想要的是这个:

result = [(k, a[k], b[k]) for k in a if k in b and a[k]!=b[k]]

换句话说,"生成由密钥,第一个值和第二个组成的元组列表,只要a中的一个键也在b中且相应的值不相等"。

由于布尔表达式带有"和"是故障安全的(他们从左到右评估,一旦找到假值就停止),你不必担心" b [k]!= a [k]"可以提出异常。

这提出了另一个问题:如果密钥在a而不是b中,反之亦然,例如, (' car',2,None)或(' car',None,2)?这也应该是一个有效的答案吗?

答案 1 :(得分:1)

我需要将字典b与a进行比较,以检查b的键是否在a中。您想要找到相交的键,然后检查它们的值:< / p>

a = {'key_1': 1,'key_2': 2, 'key_3': 3}
b = {'key_1': 1,'key_2': 5}

# find keys common to both
inter = a.keys() & b 
diff_vals = [(k, a[k], b[k]) for k in inter if a[k] != b[k]]
# find keys common to both
inter = a.keys() & b

for k,av, bv in diff_vals:
    print("key = {}, val_a = {}, val_b = {}".format(k, av, bv))
key = key_2, val_a = 2, val_b = 5

您可以在dict_view objetcs上使用许多不同的set方法:

# find key/value pairings that are unique to either dict
symmetric = a.items() ^ b.items()
{('key_2', 2), ('key_2', 5), ('key_3', 3)}


# key/values in b that are not in a    
difference = b.items() - a.items()
{('key_2', 5)}

# key/values in a that are not in b
difference = a.items() - b.items()
{('key_3', 3), ('key_2', 2)}

# get unique set of all keys from a and b
union = a.keys() | b
{'key_1', 'key_2', 'key_3'}

# get keys common to both dicts
inter = a.keys() & b
{'key_1', 'key_2'}

答案 2 :(得分:0)

我认为您发布的代码中存在一个小错误。首先,您似乎将kkey混合为同一个对象。其次,您不能在列表推导中使用两个if - 子句,而是可以将它们与and结合使用。以下是它的外观:[k for k in b if k in a and a[k]!=b[k]] 这将生成一个列表,其中包含值与之不匹配的所有键。给定这样的密钥,您可以简单地使用例如"a[{k}]={a} and b[{k}]={b}".format(k=k,a=a[k],b=b[k])获取描述该不匹配的可读字符串。当然,如果你只想创建那个键列表以便在之后循环(用于打印),那么就不需要在第一时间实际创建该列表。只需直接遍历字典键即可。

答案 3 :(得分:0)

这可能有效

a = {'key_1': 1,'key_2': 2, 'key_3': 3}
b = {'key_1': 1,'key_2': 5}
i=[k for k in b if k in a if b[k]!=a[k]]
if i:
    for k in i:
        print('not equal:b[',k,']=',b[k],'and a[',k,']=',a[k])

输出

not equal:b[ key_2 ]= 5 and a[ key_2 ]= 2