因此,defaultdict文档提到,如果一个条目缺失,则由default_factory
返回的值“被插入到键的字典中并返回”。这在大多数情况下都很好,但是在这种情况下,我实际上想要的是返回该值,但是不要将其插入到defaultdict中。
我想我可能可以继承defaultdict并覆盖...我猜是 __missing__
? 不确定。怎样做最好?
提前感谢。
因此,defaultdict文档提到,如果一个条目缺失,则由default_factory
返回的值“被插入到键的字典中并返回”。这在大多数情况下都很好,但是在这种情况下,我实际上想要的是返回该值,但是不要将其插入到defaultdict中。
我想我可能可以继承defaultdict并覆盖...我猜是 __missing__
? 不确定。怎样做最好?
提前感谢。
dict
的子类并实现 __missing__
:class missingdict(dict):
def __missing__(self, key):
return 'default' # note, does *not* set self[key]
演示:
>>> d = missingdict()
>>> d['foo']
'default'
>>> d
{}
你也可以以defaultdict
为基类创建子类,这样就能获得工厂处理功能以及复制和pickle支持:
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__
的名称是错误的。
这比子类化还要简单。虽然 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' =)
d[key] += 1
,因此仍然比普通字典更合理 :-) - xjcld[key] += 1
将default+1
插入到d[key]
,同时希望value = d[key]
返回默认值而不修改字典? - Elias Hasled[key]
会插入默认键(0),而 d.get(key, 0)
则不会。 - xjcl
d.pop("unloaded_key")
设置默认值吗? - Lerner Zhangdict.pop()
方法需要第二个参数来设置默认值。与大多数其他方法不同,dict.pop()
方法不会调用__missing__
方法;只有dict.__getitem__
方法才会(例如d[missingkey]
)。 - Martijn Pietersdict
,因此只需添加def pop(self, *args): try: return super().pop(*args) except KeyError: return self.__missing__()
。如果__missing__
首先在字典中设置键,则根据需要进行调整。 - Martijn Pieters