2012-09-11 16 views
11

辞書の値が条件に一致するかどうかをPythonプログラマが確認します(私の場合は0より大きい)。私はパフォーマンスに最も影響を与えない最も「ピジョンソニック」な方法を探しています。辞書の値が条件と一致するかどうか確認してください

私の辞書:

pairs = { 'word1':0, 'word2':0, 'word3':2000, 'word4':64, 'word5':0, 'wordn':8 } 

私はこれまでのところ、これらの2(?怪物)メソッドを使用していました。

1:

options = pairs.values() # extract values 
for i in options: 
    if i > 0: 
     return True 
return False 

2:

options = sorted(pairs.items(), key=lambda e: e[1], reverse=True) # rank from max to min 
if options[0][1] > 0: 
    return True 
else: 
    return False 
+0

辞書の1つのエントリ(テキストのように)またはすべてのエントリ(コードのように)をチェックしていますか? – smcg

+0

@smcg:私の英語は申し訳ありません。私はすべてのエントリを意味した;] – Firebowl2000

答えて

20

あなたはany[docs]使用することができます。

>>> pairs = { 'word1':0, 'word2':0, 'word3':2000, 'word4':64, 'word5':0, 'wordn':8 } 
>>> any(v > 0 for v in pairs.itervalues()) 
True 
>>> any(v > 3000 for v in pairs.itervalues()) 
False 

all参照してください。:

>>> all(v > 0 for v in pairs.itervalues()) 
False 
>>> all(v < 3000 for v in pairs.itervalues()) 
True 

あなたは、Python 2.7、.itervalues()を使っているので、それは新しいリストを作成していないため、おそらく.values()よりも少し良いです。

+0

ありがとうDSM!それは非常に便利です。 – Firebowl2000

+0

私は、これを行うために、これがpythonicな方法であると言っています。 –

+0

'.values'と' .itervalues'の間に本当にどれほど大きな違いがあるのだろうか?新しいオブジェクトを作成するのではなく、新しい参照のみを作成しています...私は、実際には...(私は通常、 'values'を使用します。なぜなら、コードをpy3kに移動するときに変更する必要はないからです。しかし、そうすべきではないかもしれません)。これは間違いなくこれを行う方法です(+1) – mgilson

関連する問題