Создание ключей словаря на лету [duplicate]

11
задан martineau 7 December 2016 в 02:07
поделиться

3 ответа

class D(dict):
    def __missing__(self, key):
        self[key] = D()
        return self[key]

d = D()
d['a']['b']['c'] = 3
25
ответ дан 3 December 2019 в 01:33
поделиться

Вы можете использовать кортеж в качестве ключа для словаря, и тогда вам вообще не придется беспокоиться о субсловарях:

mydict[(key,subkey,subkey2)] = "value"

В качестве альтернативы, если вам действительно нужны субсловари по какой-то причине вы можете использовать collections.defaultdict .

Для двух уровней это просто:

>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> d['key']['subkey'] = 'value'
>>> d['key']['subkey']
'value'

Для трех это немного сложнее:

>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['key']['subkey']['subkey2'] = 'value'
>>> d['key']['subkey']['subkey2']
'value'

Четыре и более уровней оставлены в качестве упражнения для читателя. : -)

12
ответ дан 3 December 2019 в 01:33
поделиться

Мне больше нравится ответ Дейва, но вот альтернатива.

from collections import defaultdict
d = defaultdict(lambda : defaultdict(int))
>>> d['a']['b'] += 1
>>> d
defaultdict(<function <lambda> at 0x652f0>, {'a': defaultdict(<type 'int'>, {'b': 1})})
>>> d['a']['b']
1

http://tumble.philadams.net/post/85269428/python-nested-defaultdicts

Это определенно некрасиво, когда приходится использовать лямбды для реализации внутренних дефолтных коллекций, но, видимо, необходимо.

2
ответ дан 3 December 2019 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: