私は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
短い回答(下記のMontaroの回答による)
defaultdict(lambda:1)
defaultdict
sの仕組みに関する長い答え
ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
sは、存在しないキーを使用して通常の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
を構築します。
1
を返すラムダ関数を渡すことができると思います
d = defaultdict(lambda:1)