📌
[Python]可変長の値をキーにしてネストされたdictを生成する
作りたいもの
in: f(keys=(1, 2, 3), value=4)
out: {1: {2: {3: 4}}}
in: f(keys=[2, 4], value=8)
out: {2: {4: 8}}
前置き
- dict()では一度でネストされたものを作れない
d = dict()
d[0][1] = 2
"""
----> 2 d[0][1] = 2
KeyError: 0
"""
# 都度dictを生成する
d = dict()
d[0] = dict()
d[0][1] = 2
print(d) #{0: {1: 2}}
- defaultdictを使うとネストされたものを作れる
- ネストされたものを作れるがキーは固定長
from collections import defaultdict
d = defaultdict(dict)
d[0][1] = 2
print(d) # defaultdict(dict, {0: {1: 2}})
本題
- 可変長なkeyに対応するために再帰的に要素を生成する
from collections import defaultdict
def set_value_nested_dict(keys : list | tuple, value):
dct = defaultdict(dict)
if len(keys) == 1:
return {keys[0]: value}
dct[keys[0]] |= set_value_nested_dict(keys[1:], value)
return dict(dct)
# example
keys1 = (1, 2, 3)
d1 = set_value_nested_dict(keys1, 4)
print(d1) #{1: {2: {3: 4}}}
keys2 = [2, 4]
d2 = set_value_nested_dict(keys2, 16)
print(d2) # {2: {4: 16}}
Discussion