【问题标题】:Compare two dicts and print non-equal values in python比较两个字典并在python中打印不相等的值
【发布时间】:2016-10-24 07:53:14
【问题描述】:

我需要比较字典 b 和 a 来检查 b 的键是否在 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

【问题讨论】:

    标签: python dictionary key inequality


    【解决方案1】:

    我需要将字典 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,只使用viewitems()viewkeys() 用于python2。只需使用 items()keys() 即可返回您在 python3 中获得的内容。
    【解决方案2】:

    你想要的可能是这样的:

    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)?这也应该是一个有效的答案吗?

    【讨论】:

      【解决方案3】:

      我认为您发布的代码中有一个小错误。首先,您似乎为同一个对象混合了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]) 获取描述该不匹配的人类可读字符串。当然,如果您只是要创建该键列表以在之后循环它(用于打印),那么首先不需要实际创建该列表。只需直接遍历字典键即可。

      【讨论】:

        【解决方案4】:

        这可能有效

        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
        

        【讨论】:

          猜你喜欢
          • 2019-08-03
          • 2015-01-25
          • 2021-09-14
          • 2017-09-04
          • 2023-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多