90

他の誰かのコードでは、次の 2 行を読みました。

x = defaultdict(lambda: 0)
y = defaultdict(lambda: defaultdict(lambda: 0))

defaultdict の引数はデフォルトのファクトリであるため、最初の行は、存在しないキー k (v=x[k] のようなステートメントなど) に対して x[k] を呼び出すと、キーと値のペア (k ,0) は、ステートメント x[k]=0 が最初に実行されたかのように、辞書に自動的に追加されます。私は正しいですか?

そしてyはどうですか?デフォルトのファクトリは、デフォルト 0 の defaultdict を作成するようですが、具体的にはどういう意味ですか? Pythonシェルで遊んでみましたが、それが何であるかを正確に理解できませんでした。

4

5 に答える 5

78

x[k]最初の行は、存在しないキーk(のようなステートメントなど)を呼び出すと、ステートメントが最初に実行されたかのようv=x[k]に、キーと値のペア(k,0)が自動的に辞書に追加されることを意味すると思います。x[k]=0

それは正しい。これはもっと慣用的に書かれています

x = defaultdict(int)

の場合、yそうすると、キーが存在しない場合y["ham"]["spam"]はキー"ham"が挿入されます。yそれに関連付けられた値は、の値で自動的に挿入されるになりdefaultdictます。"spam"0

つまり、y一種の「2層」defaultdictです。の場合"ham" not in y、評価y["ham"]["spam"]は行うようなものです

y["ham"] = {}
y["ham"]["spam"] = 0

通常の観点からdict

于 2011-12-07T17:08:11.487 に答える
12

あなたは最初のものが正しいです。に関してはy、キーが に存在しない場合、デフォルト 0 で defaultdict を作成するため、yこれをネストされた辞書と考えることができます。次の例を検討してください。

y = defaultdict(lambda: defaultdict(lambda: 0))
print y['k1']['k2']   # 0
print dict(y['k1'])   # {'k2': 0}

defaultdict なしで同等のネストされた辞書構造を作成するには、内部の dict を作成してから 0 にy['k1']設定する必要がありますy['k1']['k2']が、defaultdict は、まだ見ていないキーに遭遇したときに、これらすべてを舞台裏で行います。

y = {}
y['k1'] = {}
y['k1']['k2'] = 0

次の関数は、インタープリターでこれをいじって理解を深めるのに役立ちます。

def to_dict(d):
    if isinstance(d, defaultdict):
        return dict((k, to_dict(v)) for k, v in d.items())
    return d

これにより、ネストされた defaultdict に相当する dict が返されます。これは、読みやすいです。たとえば、次のようになります。

>>> y = defaultdict(lambda: defaultdict(lambda: 0))
>>> y['a']['b'] = 5
>>> y
defaultdict(<function <lambda> at 0xb7ea93e4>, {'a': defaultdict(<function <lambda> at 0xb7ea9374>, {'b': 5})})
>>> to_dict(y)
{'a': {'b': 5}}
于 2011-12-07T17:16:20.360 に答える
9

defaultdict正しく説明したように、コンストラクターに対して呼び出し可能なゼロ引数を取ります。これは、キーが見つからない場合に呼び出されます。

lambda: 0もちろん、常にゼロを返しますがdefaultdict(int)、それを行うための推奨される方法は、です。これは同じことを行います。

defaultdict(int)2番目の部分については、最上位のディクショナリにキーが見つからない場合は常に、作成者は新しいディクショナリまたはネストされたディクショナリを作成したいと考えています。

于 2011-12-07T17:10:09.620 に答える
3

y = defaultdict(lambda:defaultdict(lambda:0))

これを試してみると役立ちますy['a']['b'] += 1

于 2015-01-13T08:43:53.200 に答える