默认为密钥的Python字典?

bea*_*rdc 21 python dictionary defaultdict

有没有办法让defaultdict默认返回密钥?或者一些具有同等行为的数据结构?即,在初始化字典后d,

>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
Run Code Online (Sandbox Code Playgroud)

我只看到默认字典采用不带参数的函数,所以我不确定除了创建一种新的字典之外是否还有其他解决方案.

pil*_*her 25

我会覆盖以下__missing__方法dict:

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

  • 是否有特定的理由存储密钥除了返回它?除非我*需要*知道查询了哪些密钥,否则我认为没有理由这样做. (2认同)
  • @JoachimSauer:你是对的,但存储密钥与`collections.defaultdict`的工作方式一致. (2认同)

wer*_*ika 7

编辑: 哎呀,我刚刚意识到我文件中的代码最初来自另一个stackoverflow答案!/sf/answers/203871881/,请继续投票.

这就是我使用的 - 它是一个defaultdict变体,它将键作为参数传递给default-value工厂函数,该函数作为参数传递给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
Run Code Online (Sandbox Code Playgroud)

这是你想要的用途:

>>> d = keybased_defaultdict(lambda x: x)
>>> d[1]
1
>>> d['a']
'a'
Run Code Online (Sandbox Code Playgroud)

其他可能性:

>>> d = keybased_defaultdict(lambda x: len(x))
>>> d['a']
1
>>> d['abc']
3
Run Code Online (Sandbox Code Playgroud)

  • 我真的有点惊讶[重新]发现`defaultdict`还没有像这样工作...... (2认同)