У меня есть структура данных, которая по существу сводится к вложенному словарю. Скажем, это выглядит так:
{'new jersey': {'mercer county': {'plumbers': 3,
'programmers': 81},
'middlesex county': {'programmers': 81,
'salesmen': 62}},
'new york': {'queens county': {'plumbers': 9,
'salesmen': 36}}}
Теперь сохранение и создание этого довольно болезненно; каждый раз, когда у меня есть новое состояние/графство/профессия, я должен создавать словари нижнего слоя через неприятные блоки try/catch. Более того, я должен создавать раздражающие вложенные итераторы, если я хочу перебрать все значения.
Я мог бы также использовать кортежи в качестве ключей, например:
{('new jersey', 'mercer county', 'plumbers'): 3,
('new jersey', 'mercer county', 'programmers'): 81,
('new jersey', 'middlesex county', 'programmers'): 81,
('new jersey', 'middlesex county', 'salesmen'): 62,
('new york', 'queens county', 'plumbers'): 9,
('new york', 'queens county', 'salesmen'): 36}
Это делает итерацию по значениям очень простой и естественной, но более синтаксически больно делать такие вещи, как агрегации, и рассматривать подмножества словаря (например, если я просто хочу перейти из состояния в состояние).
В принципе, иногда я хочу думать о вложенном словаре как плоском словаре, и иногда я хочу думать об этом как о сложной иерархии. Я мог бы обернуть это все в классе, но похоже, что кто-то уже сделал это. В качестве альтернативы, похоже, для этого могут быть некоторые действительно элегантные синтаксические конструкции.
Как я мог сделать это лучше?
Приложение: я знаю setdefault()
, но на самом деле это не делает чистый синтаксис. Кроме того, каждый подзадачник, который вы создаете, по-прежнему должен иметь ручной набор setdefault()
.