在下面显示的字典中,我想检查 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 中的键匹配,以及与之对应的值是否与 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"
使用集合查找所有等价物:
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()))
请注意,这确实会创建两个 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)
在这里,您只需复制每个 dict 的键以减少内存占用。
使用 Python 2.7 时,dict 类型包括直接创建所需集合的附加方法:
for (key, value) in aa.viewitems() & bb.viewitems():
print '%s: %s is present in both aa and bb' % (key, value)
这些在技术上是字典视图,但出于此问题的目的,它们的作用相同。
这可以写成单行all
:
all(bb[k] == v for k, v in aa.iteritems() if k in bb)
它也是更具声明性的方法,可以更好地传达意图。
如果要遍历所有匹配的键/值对,可以使用
for key, value in aa.viewitems() & bb.viewitems():
...
(Python 2.7)
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']
蟒蛇 3