python词典匹配两个词典中的键值

Raj*_*eev 8 python

在下面显示的词典中,我想检查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"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 16

使用集合查找所有等价物:

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

&这里的操作员为您提供两组交集 ; 或者你可以写:

set(aa.items()).intersection(set(bb.items()))
Run Code Online (Sandbox Code Playgroud)

请注意,这确实创建了两个dicts的完整副本,因此如果这些非常大,那么这可能不是最好的方法.

一个捷径只是测试密钥:

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

在这里,您只需复制每个字典的键以减少内存占用.

使用Python 2.7时,dict类型包含直接创建所需集的其他方法:

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

这些是技术上的字典视图,但出于这个问题的目的,它们的行为相同.

  • @Rajeev:不,不是!`&`是一个逻辑运算符,on sets表示`的交集.更新了答案以包含该信息. (2认同)
  • `&`是按位AND,不是逻辑AND.但这并不重要,因为套装超载了. (2认同)

Cat*_*lus 5

这可以写成一行all:

all(bb[k] == v for k, v in aa.iteritems() if k in bb)
Run Code Online (Sandbox Code Playgroud)

它也是更具声明性的方法,可能更好地传达意图.