0

Python では、次の構造を定期的に使用します。

x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
y = x[v] if v in x.keys() else None

ここで、v は通常、辞書の値の 1 つです。y は、キーが存在する場合は辞書の値を取得し、そうでない場合は None を取得します。

これが望ましい構造なのか、それとも強化できるのか疑問に思っていましたか?

x[v] は上記の値にすることができますが、同様の構造を使用して v の値に応じて関数を呼び出します。

{'a': self.f1, 'b': self.f2, 'c': self.f3, 'd': self.f4}[v]()
4

3 に答える 3

2

あなたが説明したことは、次のように言えます。

"y は、"v" が辞書に存在する場合はキー "v" の値である必要があり、それ以外の場合は "none" である必要があります

Python では、次のようになります。

y = x.get(v, None)

注: Noneキーが存在しない場合、 はすでにデフォルトの戻り値です。


あなたの質問では、辞書にメソッドへの参照が含まれている場合があることにも言及しています。この場合、yそうでない場合はメソッドになり、None通常どおり呼び出すことができます。

y(*args, **kwargs)

またはあなたの例のように:

{'a': self.f1, 'b': self.f2, 'c': self.f3, 'd': self.f4}.get(v)()

注:キーが辞書にない場合は、TypeError

于 2013-05-30T15:05:56.500 に答える
1

同様のコードのプロファイリングに何時間も費やした後、これを行う最も効率的な方法はdefaultdict...を使用することであることがわかりました。

from collections import defaultdict

x = defaultdict(lambda: None, {'a': 1, 'b': 2, 'c': 3, 'd': 4})
y = x[v]

...次に最も効率的なのは、2 つのキー検索です...

x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
y = x[v] if x in v else None

これらはどちらもこれよりもはるかに高速です...

x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
y = x.get(v, None)

...この...

x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
try:
    y = x[v]
except KeyError:
    y = None
于 2013-05-30T15:15:27.827 に答える