在Python中计算字典之间键重复的次数

4
如何检查一个字典(dict1)中的键(key)在另一个字典(dict2)中出现了多少次。如果字典(dict1)中的键(key)存在于字典(dict2)中,那么一个名为"val"的变量应该被减去初始值为4,减去的值应该根据键(key)在字典(dict2)中出现的次数而定。
例如,字典(dict1)如下所示:
print dict1
{(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 

并且 dict2 看起来像这样

print `dict2`
{(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

由于两个dict之间存在两个重复的key,因此val应该等于2
如果dict2dict1完全相同,则val应为0
另外,dict1的大小始终相同,但dict2可能非常大,因此最好使用快速查找方法。最后,这里dicts的值没有任何意义。

1
len([k for k in dict1 if k in dict2]) - Nir Alfasi
@alfasin 为什么要建立一个列表来获取其长度?sum(1 for k in dict1 if k in dict2)更有效率。然而,对于这个任务,集合交集更快。 - PM 2Ring
@PM2Ring 哈,好观点 :) - Nir Alfasi
4个回答

4

使用集合交集:

d1 = {(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 
d2 = {(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

sd1 = set(d1.keys())
sd2 = set(d2.keys())
len(sd1.intersection(sd2))

编辑: 由于关键视图已经是集合,因此您可以直接执行 d1.keys() & d2.keys()。请注意,.keys() 是一个非常便宜的调用,因为它只是提供了一种现有字典结构的替代接口(感谢评论中的 @PM2RING)。


1
关键视图已经设置为类似集合,因此您可以执行 d1.keys() & d2.keys() - PM 2Ring
1
请注意,.keys() 是一个非常便宜的调用,因为它只是提供了一个现有字典结构的替代接口。 - PM 2Ring

4

由于字典键是类似于集合的已经设置,因此您可以直接使用

len(dict1.keys() & dict2.keys())

这是针对Python 3的。在Python 2中,相应的视图对象是dict.viewkeys(),您可以类似地使用它。
len(dict1.viewkeys() & dict2.viewkeys())

0

将每个字典中的键列表转换为集合。 找到这些集合的交集和并集。 并集 - 交集 可以得到差集。 如果结果为0,则返回0; 否则,返回交集的大小。


0
这段代码适用于Python 2和3:len(set(dict1).intersection(dict2))
In [1]: dict1 = {(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1}

In [2]: dict2 = {(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100}

In [3]: len(set(dict1).intersection(dict2))
Out[3]: 2

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