In responding to another post on defaultdict, I posted an implementation of a 2-level hashtable, by creating a factory method that returned a defaultdict(dict). The OP of that other thread was trying to build a nested tree from a set of n-tuples, in which the first (n-1) values in each tuple were the keys for navigating down the tree, and the final n'th value was the value for to be assigned to the leaf node. My post worked only if n=2, which fortunately was the test case that the OP gave. But it annoyed me that this required advance knowledge of the number of keys.
I've hacked out this recursivedefaultdict which is a defaultdict(defaultdict(defaultdict(...))), arbitrarily deep depending on the keys provided in the reference. Please comment. -- Paul from collections import defaultdict data = [ ('A','B','Z',1), ('A','C','Y',2), ('A','C','X',3), ('B','A','W',4), ('B','B','V',5), ('B','B','U',6), ('B','D','T',7), ] class recursivedefaultdict(object): def __init__(self): self.__dd = defaultdict(recursivedefaultdict) def __getattr__(self,attr): return self.__dd.__getattribute__(attr) def __getitem__(self,*args): return self.__dd.__getitem__(*args) def __setitem__(self,*args): return self.__dd.__setitem__(*args) table = recursivedefaultdict() for k1,k2,k3,v in data: table[k1][k2][k3] = v for kk in sorted(table.keys()): print "-",kk for jj in sorted(table[kk].keys()): print " -",jj for ii in sorted(table[kk][jj].keys()): print " -",ii,table[kk][jj][ii] prints: - A - B - Z 1 - C - X 3 - Y 2 - B - A - W 4 - B - U 6 - V 5 - D - T 7 -- http://mail.python.org/mailman/listinfo/python-list