在Python中比较两个字典并打印出不相等的值

3
我需要将字典b与a进行比较,以检查b的key是否在a中。如果存在,则检查 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个回答

2
我需要将字典b与a进行比较,以检查b的键是否在a中。您想找到相交的键,然后检查它们的值:
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对象上使用许多不同的设置方法,例如:
# 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'}

这似乎是Python3代码,对吗?因为对于Python2,我不得不将大部分代码包装到Set()结构中。 - helt
@helt,在Python2中只需使用viewitems()viewkeys()即可。这将返回与在Python3中使用items()keys()相同的结果。 - Padraic Cunningham

1
您想要的可能是这个:

你所需要的很可能是这个:

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

换句话说,“生成一个元组列表,由键、第一个值和第二个值组成,每当a中的键也在b中且相应的值不相等时”。由于“and”运算符的布尔表达式是安全的(它们从左到右进行计算,并在发现False值后立即停止),因此您不必担心“b [k]!= a [k]”会引发异常。这引出了另一个问题:如果键在a中而不在b中,或者反之亦然,例如('car',2,None)或('car',None,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])来获取描述该不匹配的人类可读字符串。当然,如果你只是要创建那个键的列表以后循环(用于打印),那么根本没有必要在第一次创建那个列表。直接迭代字典键即可。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接