2

対応する値が最小値を上回り、特定のリストにある辞書内のすべてのキーを取得する必要があります。何かのようなもの:

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

ただし、許可されるキーに制限がない場合もあります。それを行うのに最もPython的なのは、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]

もっと賢明でパイソン的な解決策があるに違いないと思います。ラムダ関数を使用することを考えましたが、よくわかりません。何か案は?

4

4 に答える 4

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)]

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

于 2012-04-28T00:48:35.763 に答える
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)
于 2012-04-28T00:52:37.103 に答える
2

また、解決策として「最も Pythonic な」構文を求めることに加えて、優れた設計原則 (たとえばThe Zen of Python ) に従う必要があります。

allow_all_keysの意味をオーバーロードするのではなく、ブール値のプロパティを導入することで、コードはより明確になりますallowed_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から:

明示的は暗黙的よりも優れています。
シンプルは複雑よりも優れています。
読みやすさのカウント

于 2012-04-28T01:11:45.607 に答える
1

あなたの現在のソリューションはうまくいくと思います。allowed_keys読みやすく、明示的で効率的です (制限がない場合は 1 回だけテストしてください)。

本当にワンライナーを使用したい場合allowed_keysは、制限がないときにキーの完全なセットに設定する必要があります。に設定allowed_keysするNoneと、キーが許可されないことを意味し、意味的に直観に反します..

于 2012-04-28T01:00:35.413 に答える