有没有办法让defaultdict默认返回key?或者有一种等效行为的数据结构吗?即,在初始化字典d
后,
>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
我只见过默认字典(default dictionaries)使用不需要参数的函数,所以除了创建一个新类型的字典之外,我不确定是否有其他解决方案。有没有办法让defaultdict默认返回key?或者有一种等效行为的数据结构吗?即,在初始化字典d
后,
>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
我只见过默认字典(default dictionaries)使用不需要参数的函数,所以除了创建一个新类型的字典之外,我不确定是否有其他解决方案。我会重写 dict
的 __missing__
方法:
>>> class MyDefaultDict(dict):
... def __missing__(self, key):
... self[key] = key
... return key
...
>>> d = MyDefaultDict()
>>> d['joe']
'joe'
>>> d
{'joe': 'joe'}
d['joe']
没有引发 KeyError
,那么 'joe' in d
的值应该为 True
。如果我没有存储这个键,那么情况就不同了。 - pillmuncher'joe' in d
的求值为False
,除非你在此之前使用了d['joe']
。因此,纯粹的“只读”访问更改了另一个只读访问的结果。我不确定这是否更好。 - Joachim Sauercollections.defaultdict
的工作方式一致。 - pillmuncher编辑: 噢,我刚才意识到我文件中的代码最初来自于另一个stackoverflow答案!https://dev59.com/lHE85IYBdhLWcg3wKwOE#2912455,请投票支持那个答案。
以下是我使用的代码——它是一个defaultdict变体,将键作为参数传递给作为参数传递给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
这是您想要的用途:
>>> d = keybased_defaultdict(lambda x: x)
>>> d[1]
1
>>> d['a']
'a'
其他可能性:
>>> d = keybased_defaultdict(lambda x: len(x))
>>> d['a']
1
>>> d['abc']
3
defaultdict
并不像这样工作... - user166390d.get('a', 'a')
d.get('b', 'b')
d.get('c', 'c')
我认为这种方法更加清晰,对于这个目的来说不那么神秘。
如果您是DRY(Don't Repeat Yourself)的狂热者,并且只有单个字符键,您可以这样做 :)
d.get(*'a'*2)
d.get(*'b'*2)
d.get(*'c'*2)
你可能需要编写一个继承(或类似于)defaultdict
的类,并覆盖__getitem__
方法。