Ответ 1
Я бы переопределил метод __missing__
dict
:
>>> class MyDefaultDict(dict):
... def __missing__(self, key):
... self[key] = key
... return key
...
>>> d = MyDefaultDict()
>>> d['joe']
'joe'
>>> d
{'joe': 'joe'}
Есть ли способ получить defaultdict для возврата ключа по умолчанию? Или какая-то структура данных с эквивалентным поведением? I.e., после инициализации словаря d
,
>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
Я видел только словари по умолчанию, которые выполняют функции, которые не принимают параметры, поэтому я не уверен, есть ли решение, отличное от создания нового типа словаря.
Я бы переопределил метод __missing__
dict
:
>>> class MyDefaultDict(dict):
... def __missing__(self, key):
... self[key] = key
... return key
...
>>> d = MyDefaultDict()
>>> d['joe']
'joe'
>>> d
{'joe': 'joe'}
Изменить:. Я просто понял, что код в моем файле изначально появился из другого ответа 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
Если вы не хотите подкласса 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)
Вероятно, вам придется написать свой собственный класс, который наследует (или похож на) defaultdict
и переопределяет метод __getitem__
.