オブジェクトに存在できる唯一のタイプの値Counter
はintであり、ネストされたディクショナリを。で表すことはできませんCounter
。
これを通常の辞書(counter = {}
)で行う1つの方法があります。まず、更新するには、単一のキーの値をインクリメントします。
counter[key1] = counter.setdefault(key1, 0) + 1
または、ネストされた構造を作成するための任意のキーのリストの場合:
tmp = counter
for key in key_list[:-1]:
tmp = tmp.setdefault(key, {})
tmp[key_list[-1]] = tmp.setdefault(key_list[-1], 0) + 1
私はおそらくこれを次の関数に変えるでしょう:
def incr(counter, val, *keys):
tmp = counter
for key in keys[:-1]:
tmp = tmp.setdefault(key, {})
tmp[keys[-1]] = tmp.setdefault(keys[-1], 0) + val
例:
>>> counter = {}
>>> incr(counter, 1, 'a')
>>> counter
{'a': 1}
>>> incr(counter, 2, 'a')
>>> counter
{'a': 3}
>>> incr(counter, 2, 'b', 'c', 'd')
>>> counter
{'a': 3, 'b': {'c': {'d': 2}}}
>>> incr(counter, 3, 'b', 'c', 'd')
>>> counter
{'a': 3, 'b': {'c': {'d': 5}}}