web-dev-qa-db-ja.com

デフォルト値1のdefaultdict?

私はpythonが初めてで、どこかからコードスニペットを読みました。カウントソートの実装です。

コードは次のとおりです。

from collections import defaultdict
def sort_colors(A):
    ht = {}                        # a hash map
    ht = defaultdict(lambda:0, ht) # with default value 1
    for i in A:
         ht[i] += 1
    ret = []
    for k in [0, 1, 2]:
        ret.extend([k]*ht[k])
    return ret

Funcの最初の2行のように、

ht = {}
ht = defaultdict(lambda:0, ht)

この初期化については明確ではありませんが、理解するのを手伝ってもらえますか?また、これらの2行を次のように置き換えますか?

ht = defaultdict(int) # default value 0
30
chancyWu

短い回答(下記のMontaroの回答による)

defaultdict(lambda:1)

defaultdictsの仕組みに関する長い答え

ht = {}
ht = defaultdict(lambda:0, ht)

defaultdictsは、存在しないキーを使用して通常のdictにアクセスしようとすると、dictを発生させるという点でKeyErrorと異なります。
defaultdictは、エラーを発生させません。代わりにキーを作成します。どの値で? callabeの戻り値で、引数として渡しました。この場合、新しいキーはすべて、値0(単純なlambda関数lambda:0の戻り値)で作成されます。これは、int()であるため、この場合では、デフォルト関数をint()に変更しても違いはありません。

この行をさらに詳しく説明します:ht = defaultdict(lambda:0, ht)

最初の引数は関数であり、呼び出し可能なオブジェクトです。これは、存在しないキーの新しい値を作成するために呼び出される関数です。 2番目の引数htはオプションであり、新しいdefaultdictが構築されるベース辞書を参照します。したがって、htにいくつかのキーと値がある場合、defaultdictにも対応する値を持つこれらのキーがあります。これらのキーにアクセスしようとすると、古い値が取得されます。ただし、ベース辞書を渡さなかった場合、新しいdefaultdictが作成されるため、アクセスされるすべての新しいキーは呼び出し可能オブジェクトから返されるデフォルト値を取得します。
(この場合、htは最初は空のdictなので、ht = defaultdict(lambda:0)ht = defaultdict(int)を実行してもまったく違いはありません。またはht = defaultdict(lambda:0, ht):それらはすべて同じdefaultdictを構築します。

38
rafaelc

1を返すラムダ関数を渡すことができると思います

d = defaultdict(lambda:1)
33
Montaro