Я пытаюсь переписать следующий код
dct = {}
x = 'x'
y = 'y'
z = 'z'
if x not in dct:
dct[x] = defaultdict(dict)
if y not in dct[x]:
dct[x][y] = defaultdict(dict)
if z not in dct[x][y]:
dct[x][y][z] = defaultdict(list)
dct[x][y][z]['b'].append(defaultdict(int))
dct[x][y][z]['b'][0]['g']+=1
Без следующих строк:
if x not in dct:
dct[x] = defaultdict(dict)
if y not in dct[x]:
dct[x][y] = defaultdict(dict)
if z not in dct[x][y]:
dct[x][y][z] = defaultdict(list)
dct[x][y][z]['b'].append(defaultdict(int))
В идеале я хотел бы иметь такой синтаксис, как
dct = 'state what it is'
dct[x][y][z]['b'][0]['g']+=1
Используйте лямбды.
from collections import defaultdict as dd
dct = dd(lambda: dd(lambda: dd(int)))
dct["foo"][1][("a", 7)] += 1
Это не бесконечно глубоко. Я работаю над решением, которое делает.
Разместил это в ответе ниже.
Я написал настраиваемую реализацию defaultdict
, которая может делать это на произвольной глубине, в отличие от фиксированной глубины из предыдущих ответов.
class DefaultDict(dict):
def __missing__(self, name):
rval=type(self)()
self.__setitem__(name, rval)
return rval
Вот пример использования:
>>> dct=DefaultDict()
>>> dct[0][1]['bees'][('any','hashable','object')]=2
>>> dct[0][1]['bees'][('any','hashable','object')]
2
>>> 0 in dct
True
>>> 1 in dct
False
>>> dct
{0: {1: {'bees': {('any', 'hashable', 'object'): 2}}}}
@bobsmith76 Эта реализация работает произвольно глубоко со всеми хешируемыми объектами.
спасибо, я ценю это.
Также, возможно, стоит упомянуть, что если вы хотите использовать defaultdict
по какой-либо причине, вы можете использовать tree=lambda:defaultdict:tree
из связанного вопроса, но мне это не нравится по нескольким причинам. (1) Это не анонимно, поэтому возможно, что это может привести к ошибкам, если вы определите другой tree
. Возможный обходной путь — экземпляр анонимного класса, возвращающий self
в __call__
, но это неаккуратно, IMO. (2) Это также не позволяет настраивать на основе отсутствующего значения, что может пригодиться в будущих проектах. Этот комментарий в основном для будущих читателей.
Отвечает ли это на ваш вопрос? Вложенный defaultdict из defaultdict