6

我正在寻找一种能够从字典中获取值的简单方法,如果它不存在,则返回用户传入的键。

例如:

>>> lookup = defaultdict(magic)
>>> print lookup['DNE']
'DNE'
>>> print lookup.get('DNE')
'DNE'
>>> print lookup['exists']
'some other value'
>>> print lookup.get('exists')
'some other value'

这些将始终是字符串,但基本上我正在创建一个语言映射并且需要一种简单的方法来获取一个值,如果它存在则返回它,否则返回键。

有什么简单的方法可以做到这一点?或者我应该扩展 dict 并手动完成。

4

3 回答 3

17

我认为defaultdict在这里不会对您有所帮助,因为生成默认值的函数无权访问请求的密钥。

但是,您使用普通字典并使用get默认值:

>>> lookup = {}
>>> key = 'DNE'
>>> lookup.get(key, key)
'DNE'
于 2012-05-09T21:13:58.127 回答
5

应该可以使用 lambda 函数

from collections import defaultdict
a = defaultdict((lambda : 'DNE'))

编辑:对不起,我误读了这个问题。正如上面的评论已经说过的。要走的路是扩展 dict 类。

>>> class mydict(dict):
...     def __missing__(self,key):
...         return key
... 
>>> a = mydict()
>>> a['asd']
'asd'
于 2012-05-09T21:22:03.107 回答
2

这至少在 Python 2.7 下有效:

from collections import defaultdict

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

lookup = KeyAwareDefaultDict((lambda key: key))

与标准 dict 不同,defaultdict.get() 似乎也调用了 __missing__,因此它为扩展提供了更好的基础。

于 2012-05-10T05:33:24.913 回答