2016-12-02 2 views
3

Функция collection.defaultdict возвращает значение по умолчанию, которое может быть определено с помощью лямбда-функции моего собственного , если ключ отсутствует в моем словаре.Функция lambda возвращает значение ключа для использования в defaultdict

Теперь я хочу, чтобы мой defaultdict возвращал неизмененное значение ключа, если этот ключ отсутствует. Таким образом, я использую функцию lambda identity lambda x: x. Я ожидаю, что defaultdict вернет ключ.

>>>translation=defaultdict(lambda x:x) 
>>>translation['Haus']='maison' 
>>>translation['computer']='ordinateur' 
>>>translation['computer'] 
'ordinateur' 

Однако, когда я представляю свою defaultdict с до сих пор отсутствующего ключа:

>>>translation['email'] 

Я ожидаю, что перевод defaultdict вернуться 'электронной почты'. Однако, python 2.7 говорит:

TypeError: <lambda>() takes exactly 1 argument (0 given) 

Конечно, я делаю что-то глупое. Но что ?

+0

Возможный дубликат [Как сделать словарь python, который возвращает ключ для ключей, отсутствующих в словаре вместо повышения KeyError?] (Http://stackoverflow.com/questions/6229073/how-to-make-a- python-dictionary-that-returns-key-for-keys-missing-from-the-dicti) –

ответ

4

К сожалению, заводская функция определения отсутствующего ключа, используемого по умолчанию, не принимает никаких аргументов - то есть, в отличие от того, что кажется очевидным, оно не передается фактическим отсутствующим ключом.

Следовательно, вы не можете знать, какой именно ключ был использован, используя этот метод.

Альтернативой является подкласс dict себя (вместо того, чтобы использовать DefaultDict), и добавить метод __missing__: она будет называться всякий раз, когда один пытается получить ключ unexisting, а затем вы можете вернуть полученный ключ:

In [86]: class MyDict(dict): 
    ...:  __missing__ = lambda self, key: key 
    ...:  

In [87]: m = MyDict() 

In [88]: m["apples"] 
Out[88]: 'apples' 
+0

Спасибо; работает угощение. Действительно, несколько противоречит тому, что лямбда-функция не передается ключом как вход. – sixdiamants

+0

Это * * удивительно, но печально подчеркивает бесполезность стандартного типа 'defaultdict'. Май Python 4.x очистит нас от этих болезней! –

Смежные вопросы