Python Forum
Dynamic Allocation of Nested Dictionaries
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Dynamic Allocation of Nested Dictionaries
#11
Still think the exec is ugly and bad.

I think this is pretty clean way to set from a list:
from collections import defaultdict
 

def DynamicNestedDict():
    return defaultdict(DynamicNestedDict)


def try_dynamic_nested_dict():
    keylist = ['bind', 'application level', 'binding']
    loc = [20, 96, 100, 101, 102, 104, 105, 115, 193, 434, 546]
 
    dd = DynamicNestedDict()

    level = dd
    for key in keylist[:-1]:
        level = level[key]
    level[keylist[-1]] = loc
 
    print("dd['bind']['application level']['binding']: {}"
          .format(dd['bind']['application level']['binding']))
 
 
if __name__ == '__main__':
    try_dynamic_nested_dict()
Edit:
And for a possibly more convenient API:
from collections import defaultdict

 
class DynamicNestedDict(defaultdict):
    def __init__(self, *args, **kwargs):
        super(DynamicNestedDict, self).__init__(DynamicNestedDict, *args, **kwargs)

    def set_from_list(self, keylist, value):
        level = self
        for key in keylist[:-1]:
            level = level[key]
        level[keylist[-1]] = value

    def get_from_list(self, keylist):
        level = self
        for key in keylist[:-1]:
            level = level[key]
        return level[keylist[-1]]


def try_dynamic_nested_dict():
    keylist = ['bind', 'application level', 'binding']
    loc = [20, 96, 100, 101, 102, 104, 105, 115, 193, 434, 546]
    dd = DynamicNestedDict()
    dd.set_from_list(keylist, loc)
    result = dd.get_from_list(keylist)
    print("dd['bind']['application level']['binding']: {}".format(result))


if __name__ == '__main__':
    try_dynamic_nested_dict()
Testing certainly needed.


Messages In This Thread
RE: Dynamic Allocation of Nested Dictionaries - by Mekire - Oct-09-2016, 05:53 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Create Dynamic nested Dictionaries Larz60+ 8 9,222 Nov-26-2018, 12:58 AM
Last Post: DeaD_EyE

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020