3

私の印象は、許可よりも許しを求める方が Pythonic であるという観点から、これを尋ねています。

だから、私は次のようなコードをいくつか持っています:

d = dict()
try:
    d[est['state']].append(est)
except Exception:
    d[est['state']] = []
    d[est['state']].append(est)

上記のコードでは、自分自身を繰り返すことを犠牲にして、許可ではなく許しを求めていますが、これはかなり不自由です! したがって、代替案がないため、次のことを行います。

d = dict()
if est['state'] in d:
    d[est['state']].append(est)
else:
    d[est['state']] = [est]

これらのアプローチはどちらも一種の危険です。これを行うためのより良い方法は何ですか? これまでに見つけた最高のものは次のとおりです。

from collections import defaultdict
d = defaultdict(list)
d[est['state']].append(est)
4

2 に答える 2

1

pythonicの方法は、すでに発見した後者です。defaultdictは、欠損値を提供するためにファクトリ関数を呼び出すdictサブクラスです。Python2.5以降で利用できます。

>>> import collections
>>> d = collections.defaultdict(list)
>>> d[0].append('potato')
>>> d
defaultdict(<type 'list'>, {0: ['potato']})

まさにこの目的のために存在するので、dict.setdefault可能であればハッキングを避けてください。

于 2013-02-20T02:48:40.470 に答える
0

速度が気になる場合は、いくつかの異なるアプローチをベンチマークしてみてください。「辞書の if キー」アプローチを試してみたところ、try/except の方が平均で約 10% 高速であることがわかりました。この種の質問に対する私の Python のベスト プラクティスは、数年ごとに変化します。この回答は、Python 2.4 との互換性が必要な場合に役立ちます。

あなたの例を使用すると、次のようになります。

d = {}

# Confirm separately that est['state'] does not raise a KeyError.

state = est['state']

try:
    l = d[state]
except KeyError:
    l = []
    d[state] = l

l.append(est)
于 2013-02-20T03:47:17.673 に答える