【问题标题】:Comparing list values between two dictionaries that have no matching keys比较没有匹配键的两个字典之间的列表值
【发布时间】:2016-06-28 04:49:55
【问题描述】:

我有两个字典,它们的键不匹配,但值会。每个字典中的所有值都包含 3 个列表项作为整数。

dict1 = {'red':[1,2,3],'blue':[2,3,4],'orange':[3,4,5]}

dict2 = {'green':[3,4,5],'yellow':[2,3,4],'red':[5,2,6]}

我想比较每个列表并找出哪两个键具有匹配的值列表。在这种情况下,“蓝色”和“黄色”匹配,以及“绿色”和“橙色”。

我查看了这个帖子,但无法让它工作,我不确定我问的是同样的事情:comparing two dictionaries with list type values

我以前没有使用过字典,也不确定我是否理解列表推导。 (很多帖子似乎都在使用它们)

【问题讨论】:

  • 如果一个值在两个以上的键之间共享(即三种颜色具有相同的值)会发生什么?

标签: python list dictionary compare


【解决方案1】:

保持简洁:

dict1 = {'red':[1,2,3],'blue':[2,3,4],'orange':[3,4,5]}

dict2 = {'green':[3,4,5],'yellow':[2,3,4],'red':[5,2,6]}

matches = []
for key1 in dict1:
    for key2 in dict2:
        if dict1[key1] == dict2[key2]:
            matches.append((key1, key2))

print(matches)

输出:

[('blue', 'yellow'), ('orange', 'green')]

【讨论】:

  • 谢谢!效果很好,我理解。小跟进...如果字典有浮点值,我如何比较它们的截断值?
  • 别担心,伙计 :),是的,您的意思是比较诸如 3.75 之类的值,并且只查看领先的 3 进行比较?如果我错了,请纠正我。
  • 类似if all(math.abs(v1 - v2) < epsilon for v1, v2 in zip(dict1[key1], dict2[key2]))
  • 是的,不用担心@john,我为你回答了这个问题 :)
  • 我的回答对@john 有帮助吗?
【解决方案2】:

您可以使用列表推导(这只是“for 循环”的快捷方式):

matching = [(k1, k2) for k1 in dict1 for k2 in dict2 if dict1[k1] == dict2[k2]]
print matching
# [('blue', 'yellow'), ('orange', 'green')]

【讨论】:

    【解决方案3】:

    对于任何情况,如果您不理解 Julien 的回答,这也是一样的。

    dict1 = {'red':[1,2,3],'blue':[2,3,4],'orange':[3,4,5]}
    
    dict2 = {'green':[3,4,5],'yellow':[2,3,4],'red':[5,2,6]}
    
    for k1,v1 in dict1.items(): #each key and value in dict1
        for k2,v2 in dict2.items(): #each key and value in dict2
            if v1 == v2: #if values match
                print (k1,k2) #print their keys
    

    【讨论】:

    • 几乎做同样的事情,因为它只打印结果:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多