nested_dict 1.61

Creator: bradpython12

Last updated:

Add to Cart

Description:

nested dict 1.61

Note

Source code at https://github.com/bunbun/nested-dict
Documentation at http://nested-dict.readthedocs.org



nested_dict
nested_dict extends defaultdict to support python dict with multiple levels of nested-ness:

Drop in replacement for dict

>>> from nested_dict import nested_dict
>>> nd= nested_dict()
>>> nd["one"] = "1"
>>> nd[1]["two"] = "1 / 2"
>>> nd["uno"][2]["three"] = "1 / 2 / 3"
>>>
... for keys_as_tuple, value in nd.items_flat():
... print ("%-20s == %r" % (keys_as_tuple, value))
...
('one',) == '1'
(1, 'two') == '1 / 2'
('uno', 2, 'three') == '1 / 2 / 3'



Specifying the contained type


If you want the nested dictionary to hold

a collection (like the set in the first example) or
a scalar with useful default values such as int or str.





dict of lists

# nested dict of lists
nd = nested_dict(2, list)
nd["mouse"]["2"].append(12)
nd["human"]["1"].append(12)



dict of sets

# nested dict of sets
nd = nested_dict(2, set)
nd["mouse"]["2"].add("a")
nd["human"]["1"].add("b")



dict of ints

# nested dict of ints
nd = nested_dict(2, int)
nd["mouse"]["2"] += 4
nd["human"]["1"] += 5
nd["human"]["1"] += 6

nd.to_dict()
#{'human': {'1': 11}, 'mouse': {'2': 4}}



dict of strs

# nested dict of strings
nd = nested_dict(2, str)
nd["mouse"]["2"] += "a" * 4
nd["human"]["1"] += "b" * 5
nd["human"]["1"] += "c" * 6

nd.to_dict()
#{'human': {'1': 'bbbbbcccccc'}, 'mouse': {'2': 'aaaa'}}





Iterating through nested_dict
Iterating through deep or unevenly nested dictionaries is a bit of a pain without recursion.
nested dict allows you to flatten the nested levels into tuples before iteration.
You do not need to know beforehand how many levels of nesting you have:

from nested_dict import nested_dict
nd= nested_dict()
nd["one"] = "1"
nd[1]["two"] = "1 / 2"
nd["uno"][2]["three"] = "1 / 2 / 3"

for keys_as_tuple, value in nd.items_flat():
print ("%-20s == %r" % (keys_as_tuple, value))

# (1, 'two') == '1 / 2'
# ('one',) == '1'
# ('uno', 2, 'three') == '1 / 2 / 3'


nested_dict provides

items_flat()
keys_flat()
values_flat()



(iteritems_flat(), iterkeys_flat(), and itervalues_flat() are python 2.7-style synonyms. )


Converting to / from dictionaries
The magic of nested_dict sometimes gets in the way (of pickleing for example).

We can convert to and from a vanilla python dict using

nested_dict.to_dict()
nested_dict constructor

>>> from nested_dict import nested_dict
>>> nd= nested_dict()
>>> nd["one"] = 1
>>> nd[1]["two"] = "1 / 2"

#
# convert nested_dict -> dict and pickle
#
>>> nd.to_dict()
{1: {'two': '1 / 2'}, 'one': 1}
>>> import pickle
>>> binary_representation = pickle.dumps(nd.to_dict())

#
# convert dict -> nested_dict
#
>>> normal_dict = pickle.loads(binary_representation)
>>> new_nd = nested_dict(normal_dict)
>>> nd == new_nd
True




defaultdict
nested_dict extends collections.defaultdict
You can get arbitrarily-nested “auto-vivifying” dictionaries using defaultdict.

from collections import defaultdict
nested_dict = lambda: defaultdict(nested_dict)
nd = nested_dict()
nd[1][2]["three"][4] = 5
nd["one"]["two"]["three"][4] = 5

However, only nested_dict supports a dict of dict of sets etc.

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.