Translate a table to a hierarchical dictionary?

dictionary, nested, python

Solution

input = [('A1', 'B1', 'C1', 'Value'), (...)]

from collections import defaultdict

tree = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
#Alternatively you could use partial() rather than lambda:
#tree = defaultdict(partial(defaultdict, partial(defaultdict, list)))

for x, y, z, value in input:
    tree[x][y][z].append(value)

Problem

I have a table of the form: ``` A1, B1, C1, (value) A1, B1, C1, (value) A1, B1, C2, (value) A1, B2, C1, (value) A1, B2, C1, (value) A1, B2, C2, (value) A1, B2, C2, (value) A2, B1, C1, (value) A2, B1, C1, (value) A2, B1, C2, (value) A2, B1, C2, (value) A2, B2, C1, (value) A2, B2, C1, (value) A2, B2, C2, (value) A2, B2, C2, (value) ``` I'd like to work with it in python as a dictionary, of form: ``` H = { 'A1':{ 'B1':{ 'C1':[],'C2':[],'C3':[] }, 'B2':{ 'C1':[],'C2':[],'C3':[] }, 'B3':{ 'C1':[],'C2':[],'C3':[] } }, 'A2':{ 'B1':{ 'C1':[],'C2':[],'C3':[] }, 'B2':{ 'C1':[],'C2':[],'C3':[] }, 'B3':{ 'C1':[],'C2':[],'C3':[] } } } ``` So that `H[A][B][C]` yields a particular unique list of values. For small dictionaries, I might just define the structure in advance as above, but I am looking for an efficient way to iterate over the table and build a dictionary, without specifying the dictionary keys ahead of time.

Original source