13

キーエラーにヒットすることなく、テストが has_key() である dict で三項演算を行う方法はありますか? すなわち

variable = dict["the_key"] if dict.has_key("the_key") else "something"

(これは明らかにキーエラーに当たります)

それに失敗した場合、問題のキーを持っているかどうかに関係なく、辞書に基づいて一連の変数値を割り当てる最もpythonicな方法は何ですか? 繰り返す:

if dict.has_key('key'):
    value = dict['key']
else:
    value = "value"

ad nauseum は非常に洗練されていないようです。

4

5 に答える 5

14

これ:

mydict.get(key, default_value)

条件が満たされた場合にのみ部品が評価されるのdefault_valueに対し、すぐに評価されるのと 100% 同じではありません。else

于 2012-12-03T20:19:12.743 に答える
13

Jochen Ritzel の答えは、これを 99.9999% の確率で行う正しい方法です。

variable = d.get("the key", "something")

彼が指摘しているように、デフォルト値の評価を短絡することはできません。あなたは通常気にしません。デフォルト値は ですが"something"、そうではありません。デフォルトが危険であるか、生成するのに非常にコストがかかるかどうかだけが重要です。

その場合にのみ、アイデアを使用することができ、使用する必要があります。in代わりに必要なことを除いてhas_key(より読みやすく、高速で、廃止されていないため):

variable = d["the key"] if "the key" in d else expensiveComputation()

ifただし、三項式の代わりにステートメントを使用することはおそらく価値がexpensiveComputationあります。

if "the_key" in d:
    variable = d["the key"]
else:
    variable = expensiveComputation()

デフォルトのケースがまれであると予想される場合、これはより良いです:

try:
    variable = d["the key"]
except KeyError:
    variable = expensiveComputation()

何らかの理由でキーを 2 回検索するのを避ける必要があり、例外も処理できず、デフォルトを一度に短絡する必要がある場合:

sentinel = object()
variable = d.get(sentinel)
if variable == sentinel:
    variable = expensiveComputation()

そして、はい、それをすべて関数にまとめてワンライナーにすることもできますが、ほとんどの場合、3 つのまれなことを一度に実行しているという事実を隠したくありません。

または、もちろん、次のようにすることもできます。

d = collections.defaultdict(expensiveComputation)

次に、それはただです:

variable = d["the key"]

これには、返す前にを設定d["the key"]するという副作用があるため、後で を呼び出すと同じ値が返されます。それが適切だと思われる場合は、これが最良の答えです。同じキーを 2 回使用することがない場合、またはこれらのキーが巨大であり、維持するのが無駄であるなどの場合、これは悪い考えです。expensiveComputation()d["the key"]

dict.__missing__または、代わりに、以下を使用する代わりにメソッドをオーバーライドできますdefaultdict

class MyDict(dict):
    def __missing__(self, key):
        return expensiveComputation()

次に、繰り返しますが、次のとおりです。

variable = d["the key"]

これは、値を毎回個別に生成し、後で保持したくない場合に適しています。

于 2012-12-03T20:36:37.590 に答える
3

.get() メソッドを使用します。キーが存在しない場合は None が返されます。独自のデフォルトを設定することもできます。

http://docs.python.org/2/library/stdtypes.html#dict.get

value = mydict.get("key", "default")
于 2012-12-03T20:21:18.190 に答える
1

variable = d['the_key'] if 'the_key' in d else 'something'

于 2012-12-03T20:19:32.167 に答える
0
value = 'value'
if 'key' in dict:
   value = dict['key']

またはデフォルト値を定義します

dict.get('キー', '値')

于 2012-12-03T20:19:30.513 に答える