17

因此,defaultdict 文档提到,如果缺少某个项目,则default_factory“将其返回的值插入到键的字典中,并返回”。大多数时候这很好,但在这种情况下我真正想要的是返回值但插入到 defaultdict 中。

我想我可能可以继承 defaultdict 并覆盖......我猜__missing__?没有把握。解决这个问题的最佳方法是什么?

提前致谢。

4

2 回答 2

16

您可以子类化dict并实现__missing__

class missingdict(dict):
    def __missing__(self, key):
        return 'default'  # note, does *not* set self[key]

演示:

>>> d = missingdict()
>>> d['foo']
'default'
>>> d
{}

也可以子类defaultdict化,您将获得工厂处理以及复制和泡菜支持:

from collections import defaultdict

class missingdict(defaultdict):
    def __missing__(self, key):
        return self.default_factory() 

演示:

>>> from collections import defaultdict
>>> class missingdict(defaultdict):
...     def __missing__(self, key):
...         return self.default_factory() 
... 
>>> d = missingdict(list)
>>> d['foo']
[]
>>> d
defaultdict(<type 'list'>, {})

但是,正如你所看到的,__repr__它的名字确实是谎言。

于 2013-07-30T20:43:47.143 回答
0

它甚至比子类化更简单。虽然dict[key]添加键,但dict.get(key, default=None)不会将键添加到字典中:

import collections

d = collections.defaultdict(int)

assert d['test1'] == 0

print(d)
# defaultdict(<class 'int'>, {'test1': 0})

assert d.get('test2', 0) == 0
# for a more generic version, use `d.default_factory()` instead of 0

print(d)
# defaultdict(<class 'int'>, {'test1': 0})
# => did NOT insert a key for 'test2' =)
于 2020-01-18T06:24:22.677 回答