与此问题类似,我想创建一个collections.defaultdict默认值为零来计算元组列表的元素:
tuples = [('foo', 5), ('foo', 5), ('bar', -5), ('bar', -2)]
totals = defaultdict(0)
for t in tuples:
totals[t[0]] += t[1]
Run Code Online (Sandbox Code Playgroud)
但是defaultdict(0)说:
TypeError: first argument must be callable
Run Code Online (Sandbox Code Playgroud)
我怎么能创造一个"可赎回"的零?
collections.defaultdict在第一次阅读时,文档字符串非常混乱:
defaultdict(default_factory [,...]) - > dict with default factory
如果不存在键,则在不带参数的情况下调用默认工厂以生成新值,仅在getitem中.defaultdict与dict的比较等同于相同的项目.所有剩余的参数都被视为传递给dict构造函数,包括关键字参数.
所有这一切都试图说默认的"值"必须是一个函数,并且只要需要它就会在没有参数的情况下调用该函数(即,只要法线dict会引发一个KeyError.)docstring将此函数称为default_factory.
有点[, ...]说你可以选择传入一个或多个对象来作为defaultdict初始字典.从而:
In [26]: x = defaultdict(lambda: 0, a=1, b=2)
In [28]: dict(x)
Out[28]: {'a': 1, 'b': 2}
In [29]: x['c'] # This would normally raise a `KeyError`
Out[29]: 0
In [30]: dict(x) # But here it just adds a new key!
Out[30]: {'a': 1, 'b': 2, 'c': 0}
Run Code Online (Sandbox Code Playgroud)
可以使用在没有参数调用时返回零的任何函数:
In [31]: int()
Out[31]: 0
Run Code Online (Sandbox Code Playgroud)
因此,根据文档中的计数示例,您可以创建defaultdict一个默认值为零的符号:
defaultdict(int)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5233 次 |
| 最近记录: |