2016-12-27 1 views
0

큰 (약 150 만개) 키가있는 파이썬 사전이 있습니다. 각 키와 관련된 값은 숫자이며 두 개 이상의 값을 가진 값만보고하려고합니다.값이 2보다 큰 경우 키를 반복합니다.

내 현재 코드는 같은 같습니다 내 최종 보고서는 약 140 만 키가 무시되었다는 것을 보여줍니다

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 

을 그리고 이것은 (약 6 시간)을 실행하는 데 매우 오랜 시간이 걸립니다. 루프를 검사 할 필요없이 2보다 큰 값을 가진 모든 키를 루프하는 간단한 방법이 있습니까?

+0

방금 ​​유일한 키 값>이 새 사전을 원하는가? 무시 된 값을 계산하려는 경우, 원래 값의 수를 반복해야합니다. – depperm

+1

'filter '에 대한 좋은 후보가됩니다. – erip

답변

2

사용 사전 이해가 유효한 키 값을 얻을 수 있습니다 :

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

무시 키 :

당신이 원하는 것은 결과를 반복 할 경우
ks_ignored = len(d) - len(valid_kv) 
+1

'iteritems'는 Python 2입니다. Python 3의'items'.'' items'도 Python 2에서 작동합니다. – erip

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) 

하면 할 항목의 수를 점점 당신의 조건을 만족시키지 못한다면, y OU는 아래와 같이 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)) 
관련 문제