📌

[Python]可変長の値をキーにしてネストされたdictを生成する

2022/03/07に公開

作りたいもの

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