2012-04-28 8 views
2

対応する値が最小値を上回り、指定されたリストにある辞書内のすべてのキーを取得する必要があります。何かのように:リストのメンバーシップを確認するにはどうしたらいいですか?

result = [k for k in my_dict if my_dict[k] > min_value and k in allowed_keys] 

しかし、私は許可されたキーに制限がない場合があります。私は、それを行う最もpythonicがallowed_keysをNoneに設定することがわかりました。しかし、これはコードの醜い部分で私を残すだろう:

if allowed_keys is None: 
    result = [k for k in my_dict if my_dict[k] > min_value] 
else: 
    result = [k for k in my_dict if my_dict[k] > min_value and k in allowed_keys] 

私は感覚的でpythonの解決策が必要なように感じる。私はラムダ関数を使うことを考えましたが、わかりません。何か案は?

+0

可読性は、Pythonの半分よりも優れています。 – CppLearner

+0

AFAIKは、pythonicであり、可読性に直接関係しています。 – erickrf

答えて

2

許されず、それが意味的に反直感的であることを意味するの 設定allowed_keysNoneの種類あなたはまた、溶液のための「最もPython的」構文を求めているに加えて、(例えばThe Zen of Python)良いデザインの原則に従うべきです。

の意味をオーバーロードするのではなく、allow_all_keysのブール値プロパティを導入すると、コードがはっきりします。これを行うと、コードは次のようになります。

result = [k for k in my_dict if my_dict[k] > min_value and 
           (allow_all_keys or k in allowed_keys)] 

The Zen of Pythonから:

明示的、暗黙よりも優れています。
シンプルは複合体より優れています。
可読回数

+0

これは非常に読みやすく、シンプルです。ありがとうございました! – erickrf

4

あなたはリスト内包内allowed_keys is Noneを確認することができます。

result = [k for k in my_dict if my_dict[k] > min_value and (allowed_keys is None or k in allowed_keys)] 

これは本当に変な英語の文章のように見えます。

+2

+1 - しかし、この場合、 '(allowed_keysは、allowed_keysでNoneまたはkです)'が良いかもしれません。 – senderle

+0

@senderle私はそれを愛しています、私はそれを私の答えの中に追加することができますか? – okm

+0

@okm:著作権で保護されたコードだと思います。 – Blender

4

使用iteritems()あなたは私はあなたの現在のソリューションが正常に動作と思う

result = [k for k, v in my_dict.iteritems() 
      if v > min_value 
      and (k in allowed_keys if allowed_keys is not None else True)] 

# shorter but seems harder to read 
result = [k for k, v in my_dict.iteritems() 
      if v > min_value 
      and (True if allowed_keys is None else k in allowed_keys)] 

# shorter but a bit weird and slower 
result = [k for k, v in my_dict.iteritems() 
      if v > min_value 
      and (k in (allowed_keys or my_dict))] 

# senderie's comment, very clear in logic, no more no less. I'd like to pick it. 
result = [k for k, v in my_dict.iteritems() 
      if v > min_value 
      and (allowed_keys is None or k in allowed_keys) 
1

両方のキーと値にアクセスする必要があります。読み込み可能、​​明示的、効率的です(制限がない場合は、一度だけテストallowed_keys)。

本当に1ライナーを使用する場合は、制限がない場合はallowed_keysをフルセットのキーに設定する必要があります。キーが..

関連する問題