Python字典:匹配两个字典中键值对的键值

9
在下面显示的字典中,我想检查aa中的键是否与bb中的键匹配,并且对应于它的值是否在bb中匹配。有没有更好的方法来编写这段代码?
  aa = {'a': 1, 'c': 3, 'b': 2}
  bb = {'a': 1, 'b': 2}

  for k in aa:
    if k in bb:
      if aa[k] == bb[k]:
         print "Key and value bot matches in aa and bb"

你想要什么结果?你想要一个单一的布尔值,指示aa中所有与bb中出现的键都具有匹配值吗?还是每个键一个布尔值?或者是一些代码,每个匹配的键/值对都会打印一次“在aa和bb中键和值都匹配”? - Sven Marnach
1
嗯...忽略你迭代aa的方式的问题(提示,这与aa.iterkeys()相同),你的基本方法实际上非常好。你想要改进什么? - SingleNegationElimination
1
我总觉得其他人似乎都理解Rajeev一开始想做什么。然而,回答的却是完全不同的事情... - Sven Marnach
4个回答

19

使用集合来查找所有等效项:

for (key, value) in set(aa.items()) & set(bb.items()):
    print '%s: %s is present in both aa and bb' % (key, value)

这里的 & 运算符会给你两个集合的交集; 或者你也可以写成:

set(aa.items()).intersection(set(bb.items()))

请注意,这会创建两个字典的完整副本,因此如果这些字典非常大,则可能不是最佳方法。

一个快捷方式是仅测试键:

for key in set(aa) & set(bb):
    if aa[key] == bb[key]:
        print '%s: %s is present in both aa and bb' % (key, value)

为了减少内存占用,这里只复制每个字典的键。

在使用Python 2.7时,字典类型包括附加方法直接创建所需的集合:

for (key, value) in aa.viewitems() & bb.viewitems():
    print '%s: %s is present in both aa and bb' % (key, value)

这些在技术上是 字典视图,但在解决此问题时它们起到相同的作用。


2
@Rajeev:不是这样的!&是一个逻辑运算符,在集合中表示“交集”。已更新答案以包含该信息。 - Martijn Pieters
2
& 是按位与运算符,而不是逻辑与运算符。但这并不重要,因为它被重载用于集合操作。 - Cat Plus Plus
最后一个代码片段(看起来与我的答案非常相似)仅适用于Python 2.7,而不是“2.7或更高版本”。 - Sven Marnach
好吧,也许有一天会出现Python 2.8(尽管我怀疑)。暂时删除“或更高版本”。 - Martijn Pieters
哦,Python幽默的乐趣,我们有很多值得感激的地方。 :-D - Martijn Pieters

7

这可以用一行代码实现,使用all函数:

all(bb[k] == v for k, v in aa.iteritems() if k in bb)

这也是更为声明式的方法,可能会更好地传达意图。


2

如果您想迭代所有匹配的键值对,可以使用

for key, value in aa.viewitems() & bb.viewitems():
    ...

(Python 2.7)


0
aa = {'a': 1, 'c': 3, 'b': 2}
bb = {'a': 1, 'b': 2}

[k for k,v in aa.items() if k in bb]

['a', 'b']

Python 3


这个答案没有检查值是否相等的部分。它应该修改为:[k for k,v in aa.items() if k in bb and bb[k] == v] - NeilG

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