1. ホーム
  2. python

defaultdict デフォルト値 1?

2023-10-04 14:24:32

質問

私は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

どのように解決するのですか?

簡単な答え(下記のモンタローの答えと同じです。)

defaultdict(lambda:1)


どのようにするかについての長い答え defaultdict の動作について

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

defaultdict とは異なり dict にアクセスしようとすると、通常の dict に存在しないキーでアクセスしようとすると KeyError .

defaultdict しかし、これはエラーを発生させません:あなたのためにキーを作成します。どのような値で?の戻り値で callable の戻り値です。この場合、すべての新しいキーは、値 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 .