您可以通过这两个按键的set intersection迭代:
>>> set(a.keys()) & set(b.keys())
set(['a', 'c', 'b', 'd'])
下面是与类型的字典是不完全类似的例子:
from collections import Counter
a = Counter({'a':1,'b':2,'c':3,'d':4,'e':5})
b = Counter({'a':2,'b':4,'c':6,'d':8,'f':7})
common_keys = set(a.keys()) & set(b.keys())
for key in common_keys:
print("%s %d %d" % (key, a[key], b[key]))
# a 1 2
# c 3 6
# b 2 4
# d 4 8
请注意,转换到set
不preverse的Counter
顺序。
你可以转换set
为list
,并根据这两个值的总和进行排序:
a = {'a':1,'b':2,'c':3,'d':4,'e':5}
b = {'a':2,'b':4,'c':6,'d':8,'f':7}
common_keys = list(set(a.keys()) & set(b.keys()))
common_keys.sort(key=lambda k: a[k] + b[k], reverse=True)
for key in common_keys:
print("%s %d %d" % (key, a[key], b[key]))
# d 4 8
# c 3 6
# b 2 4
# a 1 2
最后,如果你不关心根据其值之和排序的关键,这里是你的代码稍加修改的版本:
from collections import Counter
a = Counter({'a':1,'b':2,'c':3,'d':4})
b = Counter({'a':2,'b':4,'c':6,'d':8})
for key, a_value in a.most_common():
if key in b:
print("%s %d %d" % (key, a_value, b[key]))
是不是将一个集合转换为一个列表,然后对它进行一些过度设计?我认为在这种情况下简单地遍历'most_common'中的键然后进行成员测试是很容易的,因此您只需要一次传递。 –
@ juanpa.arrivillaga:是的。我仍然想保留most_common功能。感谢评论,我更新了代码,但后来认识到它基本上是你已经写的。 –
嗯,我不是荷兰人或类似的东西,但我想应该只有一个明显的方法来做到这一点;) –