Using nested defaultdict objects

The defaultdict container provided by the collections module is a very useful structure. To extend its usefulness we provide convenience functions to nest them.

Creating a nested defaultdict

You can create nested containers by specifying the innermost type and the number of levels required (maximum five for now).

nested_dd = tgm.make_nested_defaultdict(set, N=3)
counter = 0
for key_A in ['B', 'A', 'X']:
    for key_B in [99, 66]:
        for key_C in ((3, 'A'), (2, 'B'), (1, 'C')):
            for set_key in ('set_A', 'set_B'):
                counter += 1
                nested_dd[key_A][key_B][key_C][set_key].add(counter)

To better visualize these nested objects, tgmtools provides a convenience function pp() that prints the content of another convenience function pf() that wraps pprint.pformat().

>>> tgm.pp(nested_dd)
{'A': {66: {(1, 'C'): {'set_A': {23},
                       'set_B': {24}},
            (2, 'B'): {'set_A': {21},
                       'set_B': {22}},
            (3, 'A'): {'set_A': {19},
                       'set_B': {20}}},
       99: {(1, 'C'): {'set_A': {17},
                       'set_B': {18}},
            (2, 'B'): {'set_A': {15},
                       'set_B': {16}},
            (3, 'A'): {'set_A': {13},
                       'set_B': {14}}}},
 'B': {66: {(1, 'C'): {'set_A': {11},
                       'set_B': {12}},
            (2, 'B'): {'set_A': {9},
                       'set_B': {10}},
            (3, 'A'): {'set_A': {7},
                       'set_B': {8}}},
       99: {(1, 'C'): {'set_A': {5},
                       'set_B': {6}},
            (2, 'B'): {'set_A': {3},
                       'set_B': {4}},
            (3, 'A'): {'set_A': {1},
                       'set_B': {2}}}},
 'X': {66: {(1, 'C'): {'set_A': {35},
                       'set_B': {36}},
            (2, 'B'): {'set_A': {33},
                       'set_B': {34}},
            (3, 'A'): {'set_A': {31},
                       'set_B': {32}}},
       99: {(1, 'C'): {'set_A': {29},
                       'set_B': {30}},
            (2, 'B'): {'set_A': {27},
                       'set_B': {28}},
            (3, 'A'): {'set_A': {25},
                       'set_B': {26}}}}}

Converting a nested defaultdict to pure Python

If you need to convert a nested defaultdict to pure Python, tgmtools provides a conversion function.

nested_dict = tgm.convert_nested_defaultdict_to_dict(nested_dd)