默认情况下有没有办法让defaultdict返回密钥?或者一些具有同等行为的数据结构?即,在初始化字典d
之后,
>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
我只看到默认词典采用不带参数的函数,所以我不确定除了创建一种新词典之外是否还有解决方案。
答案 0 :(得分:25)
我会覆盖__missing__
的{{1}}方法:
dict
答案 1 :(得分:7)
编辑:糟糕,我刚刚意识到我文件中的代码最初来自另一个stackoverflow答案! https://stackoverflow.com/a/2912455/456876,请继续投票。
这就是我使用的 - 它是一个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
答案 2 :(得分:4)
如果您不想继承dict,可以尝试使用
d.get('a', 'a')
d.get('b', 'b')
d.get('c', 'c')
我认为为此目的更清晰,更不神奇
如果你是DRY狂热者并且只有一个char键,你可以这样做:)
d.get(*'a'*2)
d.get(*'b'*2)
d.get(*'c'*2)
答案 3 :(得分:3)
您可能必须编写自己继承自(或类似于)defaultdict
的类并覆盖__getitem__
方法。