python 字典查询出多个键值对_python – 查找两个词典的匹配键值对

一种方法是:

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())}.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值