Python3:比较两个字典之间特定键和值对的差异

3
编辑:为了帮助理解背景,我实际上正在尝试将其推广到for循环和while循环中,其中我希望像这样的东西能够起作用。
if dictA[certainkey:'certainvalue'] == dictB[certainkey:'certainvalue']:
    return True

原始问题:有没有办法在Python3中比较两个字典中相同的键,以查看它们是否具有相同的值?
例如,假设
dictA = {1:'Y', 2:'E', 3:'E'}
dictB = {1:'Y', 2:'A', 3:'W'}

我希望程序在dictA中某个键值对与dictB中对应的键值对相同的情况下,返回True。在这个例子中,键1在dictA和dictB中都与值'Y'配对。我不知道有没有好的方法可以实现这一点,所以我自然而然地尝试了...
print(dictA[1:'Y'] == dictB[1:'Y'])

希望能够打印出一个True给我。由于这并没有起作用(而且我还不够了解字典),所以我想知道是否有其他的方法可以做到这一点。谢谢!
4个回答

3
你可以在相等的(键,值)对上合并字典,然后针对合并后的字典运行后续检查。
>>> dictA = {1:'Y', 2:'E', 3:'E'}
>>> dictB = {1:'Y', 2:'A', 3:'W'}
>>> 
>>> merged = dict(dictA.items() & dictB.items())
>>> merged
{1: 'Y'}
>>> 
>>> 1 in merged
True
>>> 3 in merged
False

创建 merged 非常简单,因为 dict.keysdict.valuesdict.items 的返回值支持与集合相关的操作,如并集、交集等。
注意:字典中的值必须是可哈希的。如果您的字典中有不可哈希的值,请通过以下方式创建 merged
>>> b_items = dictB.items()
>>> merged = dict(pair for pair in dictA.items() if pair in b_items)

我稍微编辑了一下我的问题,以反映我实际上正在尝试将其推广到for循环中工作,因此我想检查某个键值对是否与另一个字典中的相同键值对匹配。 - ShinyPebble
@Ferreroire for...: if key in merged: <do something> - timgeb
1
非常感谢,我已经成功使用合并的方法实现了一个优美的解决方案。我将您的答案标记为已回答此问题。 - ShinyPebble

2

首先获取字典之间匹配的键,然后使用字典推导式比较每个匹配的键。

matching_keys = dictA.keys() & dictB.keys()

>>> {k: dictA[k] == dictB[k] for k in matching_keys}
{1: True, 2: False, 3: False}

要仅获取值匹配的键,请使用列表推导:

keys_with_matching_values = [k for k in matching_keys if dictA[k] == dictB[k]]
# Or: [k for k in dictA if k in dictA and dictA[k] == dictB[k]]

>>> keys_with_matching_values
[1]

请注意,这两种方法都非常节省内存,因为它们不会在字典中不必要地存储匹配值。

我本来想用 for 循环来自己回答,但是@Alexander已经给出了你真正想要的答案。 - UtahJarhead
1
@OP,请参考这篇帖子:https://dev59.com/UGTWa4cB1Zd3GeqPDXO0 - UtahJarhead
你点醒了我!& 操作符使我的代码更易读!我通常使用交集,但这种方法更易理解和维护! - Eir Nym

1
for key in dictA
    i = 0
    if key in dictA:
        word = dictA[0][i]
        if dictA[0][i] == dictB[0][0]:
            print(word + 'matches dict 0')
        if dictA[0][i] == dictB[0][1]:
            print(word + 'matches dict 1')
        if dictA[0][i] == dictB[0][2]:
            print(word + 'matches dict 2')
            i += 1

我是在通勤班车上匆忙写下这段代码的,它有些粗糙,我可以为dictB编写一个循环。但这应该可以自动化查找单词的过程。(但可能不起作用,因为我匆忙写的)

1
你可以在列表推导式中实现你提到的操作。
print([True if dicta[k] == dictb[k] else False for k in dicta])
# [True, False, False]

扩展
for k in dicta:
    if dicta[k] == dictb[k]:
        print(True)
    else:
        print(False)

1
如果两个字典中都不存在某些键,则必须捕获 KeyError(或通过执行 in 检查再次进行哈希)。 - timgeb
1
@timgeb 是的,我也曾考虑过这一点,但对于这种特定情况来说并不需要。如果 OP 觉得有用,并且那是一个额外的因素,我会加入进去,但如果没有必要,我不想过于复杂化。 - vash_the_stampede

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