def tree():
return defaultdict(tree)
Хочу усложнить это дерево, чтобы можно было задавать ограниченное число уровней вложенности, и последний заканчивался бы указанной мной функцией:def tree2(levels=0, func=None):
pass
Например, выражениеd = tree2(levels=2, func=int)
d = defaultdict(lambda: defaultdict(int))
d['key1']['key2'] += 5
Как это можно грамотно реализовать? Пока смотрю в сторону reduce(). def tree(levels=0, func=None):
if levels > 0 and func:
return defaultdict(reduce(lambda f, i: lambda: defaultdict(f), xrange(levels-1), func))
else:
return defaultdict(tree)
>>> d = tree()
>>> d[1][2][3][4][5] = 6
>>> d = tree(3, float)
>>> d
defaultdict(<function <lambda> at 0x0280E3F0>, {})
>>> d[1][2][3]
0.0
>>> d[7][8][9] += 10
>>> d[7][8][9]
10.0
def tree(func=lambda: tree(), depth=0):
return defaultdict(reduce(lambda f, i: lambda: defaultdict(f), xrange(depth-1), func))
>>> def tree(func=None, level=-1):
... if not func:
... func = tree
... if not level:
... return func()
... return defaultdict(lambda : tree(func, level-1))
...
>>> f = tree()
>>> f
defaultdict(<function <lambda> at 0x2b00e978>, {})
>>> f[3]
defaultdict(<function <lambda> at 0x2b00eb28>, {})
>>> f[1][2][3][4]
defaultdict(<function <lambda> at 0x2b00ec48>, {})
>>> f = tree(float, 3)
>>> f[1]
defaultdict(<function <lambda> at 0x2b00eb28>, {})
>>> f[1][2]
defaultdict(<function <lambda> at 0x2b00ec00>, {})
>>> f[1][2][3]
0.0