Reputation: 295
I am trying to create a big dict that encapsulate dicts from a list of keys: i have this following list :
lis = ['model', 'properties', 'config', 'properties', 'zookeeperStorageSize', 'default']
i can iterate in reverse order this list but i'm not able to create this big object
here the output that i want :
{'model': {'properties': {'config': {'properties': {'zookeeperStorageSize': {'default': '50m'}}}}}}
any leads ?
Upvotes: 4
Views: 148
Reputation: 4315
Ex.
mylist = ['model', 'properties', 'config', 'properties', 'zookeeperStorageSize', 'default']
output_dict = {}
for key in reversed(mylist):
if mylist.index(key) == len(mylist)-1:
output_dict = {key: '50m'}
else:
# re-assign output_dict value
output_dict = {key: output_dict}
print output_dict
O/P:
{'model': {'properties': {'config': {'properties':{'zookeeperStorageSize': {'default': '50mb'}}}}}}
Upvotes: 0
Reputation: 164783
This is a functional solution using collections.defaultdict
to create a nested defaultdict of defaultdicts:
from collections import defaultdict
from functools import reduce
from operator import getitem
tree = lambda: defaultdict(tree)
d = tree()
def getFromDict(dataDict, mapList):
"""Iterate nested dictionary"""
return reduce(getitem, mapList, dataDict)
lis = ['model', 'properties', 'config', 'properties', 'zookeeperStorageSize', 'default']
getFromDict(d, lis[:-1])[lis[-1]] = '50m'
print(d['model']['properties']['config']['properties']['zookeeperStorageSize']['default'])
# 50
Upvotes: 2
Reputation: 1695
here is my solution:
def listtodict(mylist, final_value):
if len(mylist) == 1:
return {mylist[0]:final_value}
else:
return {mylist[0]:listtodict(mylist[1:], final_value)}
mylist = ['model', 'properties', 'config', 'properties', 'zookeeperStorageSize', 'default']
print(listtodict(mylist, "50m"))
prints:
{'model': {'properties': {'config': {'properties': {'zookeeperStorageSize': {'default': '50m'}}}}}}
Upvotes: 2