setdefault がa
辞書内包表記内で発生するたびに 1 ずつインクリメントされないのはなぜですか? 何が起きてる?
代替ソリューションは素晴らしいです。なぜこれが機能しないのかを理解することに主に興味があります。
setdefault が機能するループ
a = [1,1,2,2,2,3,3]
b = {}
for x in a:
b[x] = b.setdefault(x, 0) + 1
b
Out[4]: {1: 2, 2: 3, 3: 2}
setdefault による辞書内包表記が機能しない
b = {k: b.setdefault(k, 0) + 1 for k in a}
b
Out[7]: {1: 1, 2: 1, 3: 1}
アップデート
答えてくれてありがとう、私は解決策のタイミングを試してみたかった.
def using_get(a):
b = {}
for x in a:
b[x] = b.get(x, 0) + 1
return b
def using_setdefault(a):
b = {}
for x in a:
b[x] = b.setdefault(x, 0) + 1
return b
timeit.timeit(lambda: Counter(a), number=1000000)
Out[3]: 15.19974103783569
timeit.timeit(lambda: using_get(a), number=1000000)
Out[4]: 3.1597984457950474
timeit.timeit(lambda: using_setdefault(a), number=1000000)
Out[5]: 3.231248461129759