Подтвердить что ты не робот

Словарь Python по умолчанию?

Есть ли способ получить defaultdict для возврата ключа по умолчанию? Или какая-то структура данных с эквивалентным поведением? I.e., после инициализации словаря d,

>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'

Я видел только словари по умолчанию, которые выполняют функции, которые не принимают параметры, поэтому я не уверен, есть ли решение, отличное от создания нового типа словаря.

4b9b3361

Ответ 1

Я бы переопределил метод __missing__ dict:

>>> class MyDefaultDict(dict):
...     def __missing__(self, key):
...         self[key] = key
...         return key
...
>>> d = MyDefaultDict()
>>> d['joe']
'joe'
>>> d
{'joe': 'joe'}

Ответ 2

Изменить:. Я просто понял, что код в моем файле изначально появился из другого ответа stackoverflow! fooobar.com/questions/42393/..., перейдите к этому.

Это то, что я использую - это вариант defaultdict, который передает ключ в качестве аргумента функции по умолчанию factory, которая передается как аргумент init, а не без аргументов:

class keybased_defaultdict(defaultdict):
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        else:
            value = self[key] = self.default_factory(key)
            return value

Это то, что вы хотите:

>>> d = keybased_defaultdict(lambda x: x)
>>> d[1]
1
>>> d['a']
'a'

Другие возможности:

>>> d = keybased_defaultdict(lambda x: len(x))
>>> d['a']
1
>>> d['abc']
3

Ответ 3

Если вы не хотите подкласса dict, вы можете попробовать использовать

d.get('a', 'a')
d.get('b', 'b')
d.get('c', 'c')

Что я считаю более ясным и менее волшебным для этой цели

Если вы сумасшедший фанатик и имеете только один ключ char, вы можете сделать это:)

d.get(*'a'*2)
d.get(*'b'*2)
d.get(*'c'*2)

Ответ 4

Вероятно, вам придется написать свой собственный класс, который наследует (или похож на) defaultdict и переопределяет метод __getitem__.