MelDev
MelDev

Reputation: 295

Iterate a list in reverse order and create dynamic dictionaries

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

Answers (3)

bharatk
bharatk

Reputation: 4315

  • reversed function returns a reverse iterator.

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

jpp
jpp

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

Ali Yılmaz
Ali Yılmaz

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

Related Questions