collections.defaultdict
很棒。特别是与lambda
:
>>> import collections
>>> a = collections.defaultdict(lambda : [None,None])
>>> a['foo']
[None, None]
有没有办法在lambda中使用给定的键(例如'foo'
)?例如(不起作用):
>>> a = collections.defaultdict(lambda : [None]*key)
>>> a[1]
[None]
>>> a[2]
[None, None]
>>> a
defaultdict(<function <lambda> at 0x02984170>, {1: [None], 2: [None, None]})
答案 0 :(得分:31)
每当您尝试访问dict中不存在的项时,您可能希望在__missing__
上调用dict
; vanilla __missing__
引发异常,但你可以在子类中做任何你喜欢的事情:
class A(dict):
def __missing__(self, key):
value = self[key] = [None] * key
return value
答案 1 :(得分:2)
结合SingleNegationElimination和rplnt以及the defaultdict documentation的答案,我使用了以下解决方案。
import collections
class KeyBasedDefaultDict(collections.defaultdict):
def __missing__(self, key):
if self.default_factory is None:
raise KeyError(key)
self[key] = self.default_factory(key)
return self[key]
该方法的主体可能只是return self.default_factory(key)
,但额外的代码确保复制所有defaultdict行为。
问题描述的用法:
d = KeyBasedDefaultDict(lambda key: [None] * key)
d[1]
> [None]
d[2]
> [None, None]
答案 2 :(得分:1)
这将按要求工作,虽然它可能不是最佳解决方案(您需要使用默认调用初始化它,然后不使用它)。它可能可以通过覆盖其他一些方法来解决。
class NoneDict(collections.defaultdict):
def __setitem__(self, key, value):
super(NoneDict, self).__setitem__(key, key*[None])