我有一个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的所有键,而无需在循环内部执行检查,从而大大提高速度?
答案 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 comprehension,filter()
和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))