一种方法是:
d_inter = dict([k, v for k, v in dict1.iteritems() if k in dict2 and dict2[k] == v])
另一个:
d_inter = dict(set(d1.iteritems()).intersection(d2.iteritems()))
我不确定哪一个更有效率,所以让我们比较它们:
1.迭代通过dicts的解决方案:
>我们解析dict1的所有键:for k,v in dict1.iteritems() – >上)
>然后我们检查密钥是否在dict2中,如果k在dict2和dict2 [k] == v – > O(M)
这使得它成为O(n m) – >的全局最坏情况复杂度.上)
2.套装解决方案:
如果我们假设将一个字典转换成一个集合是O(n):
>我们解析d1的所有项目以创建第一组集合(d1.iteritems()) – >上)
>我们解析d2的所有项目以创建第二组集合(d2.iteritems()) – > O(M)
>在最坏的情况下,我们得到平均为O(min(len(s),len(t))或O(n * m)的两者的交叉点
这使得它成为O(2n * n * m)的全局最坏情况复杂度,对于相同大小的dicts可以被认为是O(n ^ 3):那么解决方案1.是最好的
如果我们假设将一个字典转换成一个集合是O(1)(常数时间)
平均值是O(min(n,m)),最坏的情况是O(n * m),那么解决方案#1在最坏的情况下是最好的,但是解决方案#2在平均情况下是最好的,因为O(nm) > O(分钟(N,M)).
总之,您选择的解决方案将取决于您的数据集和您将进行的测量! 😉
N.B.:我把集合()的复杂性带到there.
N.B.2:对于解决方案#1,总是最小的dict为dict2,对于解决方案#2,最小的dict为dict1.
N.B.2016:这个解决方案是为python2编写的.以下是使python3准备就绪所需的更改:
>用items()替换iteritems();>你也可以使用更新的字典理解语法:{[k,v for … == v]};>因为d.items()返回不再可以清除的dict_items,你必须使用frozenset()而不是{frozenset(d1.items()).intersection(d2.items())}.