Как вы создаете вложенные defaultdicts в Python с объектами другого типа

Я пытаюсь переписать следующий код

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

Отвечает ли это на ваш вопрос? Вложенный defaultdict из defaultdict

Kraigolas 17.05.2022 22:51
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
1
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте лямбды.

from collections import defaultdict as dd

dct = dd(lambda: dd(lambda: dd(int)))

dct["foo"][1][("a", 7)] += 1

Это не бесконечно глубоко. Я работаю над решением, которое делает.

Mous 17.05.2022 23:45

Разместил это в ответе ниже.

Mous 18.05.2022 00:06
Ответ принят как подходящий

Я написал настраиваемую реализацию 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 Эта реализация работает произвольно глубоко со всеми хешируемыми объектами.

Mous 18.05.2022 00:07

спасибо, я ценю это.

bobsmith76 18.05.2022 01:50

Также, возможно, стоит упомянуть, что если вы хотите использовать defaultdict по какой-либо причине, вы можете использовать tree=lambda:defaultdict:tree из связанного вопроса, но мне это не нравится по нескольким причинам. (1) Это не анонимно, поэтому возможно, что это может привести к ошибкам, если вы определите другой tree. Возможный обходной путь — экземпляр анонимного класса, возвращающий self в __call__, но это неаккуратно, IMO. (2) Это также не позволяет настраивать на основе отсутствующего значения, что может пригодиться в будущих проектах. Этот комментарий в основном для будущих читателей.

Mous 18.05.2022 02:04

Другие вопросы по теме