如果value大于2,则循环键

时间:2016-12-27 16:01:42

标签: python performance dictionary

我有一个Python字典,它有很多(约150万)个键。与每个键关联的值是一个数字,我只想报告值大于2的值。

我当前的代码类似于:

ks_ignored = 0
for k in d.keys():
    if( d[k] > 2 ):
        print "Key(%s) has value %s"%( k, d[k] )
    else: 
        ks_ignored += 1

我的最终报告显示,大约有140万个密钥被忽略,这需要很长时间才能运行(大约6个小时)。是否有一种简单的方法可以循环遍历值大于2的所有键,而无需在循环内部执行检查,从而大大提高速度?

2 个答案:

答案 0 :(得分:2)

使用字典理解来获取有效的键值:

valid_kv = {k:v for k,v in d.iteritems() if v > 2}

忽略键:

ks_ignored = len(d) - len(valid_kv)

答案 1 :(得分:1)

如果你想要的是循环结果,itertools.ifilter()应该适合你。以下是list comprehensionfilter()itertools.ifilter()的时间执行:

import time
import itertools


l = [i for i in range(1000000)]

t1 = time.time()
r1 = [i for i in l if i > 100]
t2 = time.time()

t3 = time.time()
r2 = filter(lambda i: i>100, l)
t4 = time.time()


t5 = time.time()
r3 = itertools.ifilter(lambda i: i>100, l)
t6 = time.time()

print t2-t1
print t4-t3
print t6-t5

<强>输出:

0.151000022888  # lc
0.100000143051  # filter
0.000999927520752  # ifilter

您的解决方案:

res = itertools.ifilter(lambda item: d[item]>2, d)

如果要求获得不符合您条件的项目数量,您可以使用filter(),如下所示:

res = filter(lambda item: d[item]>2, d)
ks_ignored = len(d) - len(res)

或者:

ks_ignored = len(filter(lambda item: d[item]<=2, d))