Это близко:
class recursivedefaultdict(defaultdict):
def __init__(self, attrFactory=int):
self.default_factory = lambda : type(self)(attrFactory)
self._attrFactory = attrFactory
def __getattr__(self, attr):
newval = self._attrFactory()
setattr(self, attr, newval)
return newval
d = recursivedefaultdict(float)
d['abc']['def']['xyz'].count += 0.24
d['abc']['def']['xyz'].total += 1
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),
]
table = recursivedefaultdict(int)
for k1,k2,k3,v in data:
table[k1][k2][k3] = v
Это не совсем то, что вы хотите, так как самый глубоко вложенный уровень не имеет ваших значений по умолчанию 0 для 'count' или 'total'.
Отредактировано: Ах, теперь это работает - просто нужно добавить метод __getattr__
, и он делает то, что вы хотите.
Редактировать 2: Теперь вы можете определить другие фабричные методы дляатрибуты, кроме целыхНо все они должны быть одного типа, их число не должно быть float, а total быть int.