我需要将字典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
答案 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)
我认为您发布的代码中存在一个小错误。首先,您似乎将k
和key
混合为同一个对象。其次,您不能在列表推导中使用两个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