2016-12-27 6 views
0

私は大きな(〜150万)のキーを持つPython辞書を持っています。各キーに関連付けられた値は数値であり、2より大きい値を持つ値のみをレポートしたいとします。値が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

をあなただけの> 2のみのキー値を持つ新しい辞書をしたいですか?私はあなたが無視された値を数えたいと思っていれば元の値の数を反復しなければならないと信じています – 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

、はあなたのために働く必要があります。以下はlist comprehensionfilter()との時間の実行です:

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) 

行う項目の数を取得した場合あなたの条件を満たしていない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)) 
関連する問題