defaultdict of arbitrary depth

Paul McGuire ptmcg at austin.rr.com
Thu Aug 16 23:25:13 EDT 2007


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




More information about the Python-list mailing list