一个类有一个构造函数,它接受一个参数:
class C(object):
def __init__(self, v):
self.v = v
...
Run Code Online (Sandbox Code Playgroud)
在代码的某处,dict中的值可以用来知道它们的键.
我想使用defaultdict,并将密钥传递给新生默认值:
d = defaultdict(lambda : C(here_i_wish_the_key_to_be))
Run Code Online (Sandbox Code Playgroud)
有什么建议?
Joc*_*zel 114
它几乎没有资格聪明 - 但子类化是你的朋友:
class keydefaultdict(defaultdict):
def __missing__(self, key):
if self.default_factory is None:
raise KeyError( key )
else:
ret = self[key] = self.default_factory(key)
return ret
d = keydefaultdict(C)
d[x] # returns C(x)
Run Code Online (Sandbox Code Playgroud)
Stu*_*erg 24
不,那里没有.
该defaultdict
实现不能被配置为传递失踪key
到default_factory
外的开箱.您唯一的选择是实现您自己的defaultdict
子类,如上面@JochenRitzel所建议的那样.
但这并不像标准库解决方案那样"聪明"或几乎一样干净(如果它存在的话).因此,你的简洁,是/否问题的答案显然是"不".
标准库缺少这种经常需要的工具太糟糕了.
我只是想用一个让类型检查员满意的版本来扩展Jochen Ritzel 的答案:
from typing import Callable, TypeVar
K = TypeVar("K")
V = TypeVar("V")
class keydefaultdict(dict[K, V]):
def __init__(self, default_factory: Callable[[K], V]):
super().__init__()
self.default_factory = default_factory
def __missing__(self, key: K) -> V:
if self.default_factory is None:
raise KeyError(key)
else:
ret = self[key] = self.default_factory(key)
return ret
Run Code Online (Sandbox Code Playgroud)
我觉得你根本不需要defaultdict
这里.为什么不只是使用dict.setdefault
方法?
>>> d = {}
>>> d.setdefault('p', C('p')).v
'p'
Run Code Online (Sandbox Code Playgroud)
那当然会创造许多实例C
.如果这是一个问题,我认为更简单的方法将做:
>>> d = {}
>>> if 'e' not in d: d['e'] = C('e')
Run Code Online (Sandbox Code Playgroud)
就defaultdict
我所见,它会比任何其他选择更快.
关于in
测试速度与使用try-except子句的ETA:
>>> def g():
d = {}
if 'a' in d:
return d['a']
>>> timeit.timeit(g)
0.19638929363557622
>>> def f():
d = {}
try:
return d['a']
except KeyError:
return
>>> timeit.timeit(f)
0.6167065411074759
>>> def k():
d = {'a': 2}
if 'a' in d:
return d['a']
>>> timeit.timeit(k)
0.30074866358404506
>>> def p():
d = {'a': 2}
try:
return d['a']
except KeyError:
return
>>> timeit.timeit(p)
0.28588609450770264
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12954 次 |
最近记录: |