table[key][0] += 1 でやっていることがわからない。
Kaggleで他の人のノートブックをみている際に以下のような記述を見つけた。
import random
import string
import collections
action_seq = [2,1]
action_seq, table = [], collections.defaultdict(lambda: [0, 0, 0])
key = ''.join([str(a) for a in action_seq[:-1]])
table[key][0] += 1
print(table[key][0])
上記の実行結果は以下のようになる。
1
正直何がどうなって「1」という結果になるのかさっぱりわからなかった。
collections.defaultdict()の処理内容や、lambdaについても確認したがそれでもよくわからない。
そもそも配列に対して「+= 1」を行う行為がどのような結果になるのか想像がつかなかった。
どのようにして理解をしたか
以下のようなデバックを行うことで動き方を理解することができた。
import random
import string
import collections
action_seq, table = [], collections.defaultdict(lambda: [0, 0, 0])
action_seq = [2,1]
key = ''.join([str(a) for a in action_seq[:-1]])
print(table)
table[key][0] += 1
print(table)
table[key][1] += 1
print(table)
table[key][2] += 1
print(table)
結果は以下のようになる。
defaultdict(<function <lambda> at 0x7fd38dfa43b0>, {})
defaultdict(<function <lambda> at 0x7fd38dfa43b0>, {'2': [1, 0, 0]})
defaultdict(<function <lambda> at 0x7fd38dfa43b0>, {'2': [1, 1, 0]})
defaultdict(<function <lambda> at 0x7fd38dfa43b0>, {'2': [1, 1, 1]})
この結果からわかることは、「table[key][0] += 1」では以下のような構成で処理される。
table[key]...テーブルのキーを「2」に設定
[0]...デフォルトで設定した[0,0,0]の1番目の列を指定
+= 1...テーブルキー2の配列の1番目の列の値に1を加算
あくまで[key]の後に指定している[0]は列指定であることがわかりました。
※二次元配列なのか?とか余計なことを考えていたので混乱しました。。
結構この処理内容を理解するのに時間が掛かったので参考になれば嬉しいです。