====== Python: Dict ======
* nested dict to flatten dict
import pandas as pd
d = {'a': 1,
'c': {'a': 2, 'b': {'x': 5, 'y' : 10}},
'd': [1, 2, 3]}
df = pd.json_normalize(d, sep='.')
print(df.to_dict(orient='records')[0])
# https://stackoverflow.com/questions/6027558/flatten-nested-dictionaries-compressing-keys
* nested dict to object
from types import SimpleNamespace
import json
class Config(SimpleNamespace):
def __init__(self, config_dict):
super().__init__(**config_dict)
def dict2obj(d):
return json.loads(json.dumps(d), object_hook=Config)
config_dict = {'a': 1, 'b': {'c': 2}, 'd': ['hi', {'foo': 'bar'}]}
config = dict2obj(config_dict)
print(config.a)
# https://stackoverflow.com/questions/1305532/convert-nested-python-dict-to-object
* nested dict to namedtuple
from collections import namedtuple
def make_config(cfg):
if isinstance(cfg, dict):
return make_config_dict(cfg)
elif isinstance(cfg, list):
return make_config_list(cfg)
else:
raise NotImplementedError()
def make_config_dict(cfg):
Config = namedtuple('Config', cfg.keys())
values = list()
for value in cfg.values():
if isinstance(value, dict):
value = make_config_dict(value)
elif isinstance(value, list):
value = make_config_list(value)
values.append(value)
return Config(*values)
def make_config_list(cfg):
values = list()
for value in cfg:
if isinstance(value, dict):
value = make_config_dict(value)
elif isinstance(value, list):
value = make_config_list(value)
values.append(value)
return values
config_dict = {'a': 1, 'b': {'c': 2}, 'd': ['hi', {'foo': 'bar'}]}
config = make_config(config_dict)
print(config)
{{tag>python dict}}