defaultdict
的参数必须是一个“可调用对象”,该对象返回一个默认值。请按以下方式定义您的默认字典:
d = defaultdict(lambda: (0, 0.0))
int
和 float
类型可以被调用并返回零,这是一种方便,但与 defaultdict 的工作方式没有任何关系。
让 +=
起作用会带来一些麻烦;元组之间的加法是将元组拼接起来,所以您需要采用冗长的方式来实现:
left, right = d["key"]
d["key"] = (left + 2, right + 3)
编辑:如果你一定要使用+=,那么只要你有一个具有所需操作的集合类型,就可以这样做。fileoffset建议使用numpy
数组类型,这可能是个不错的主意,但你也可以通过子类化tuple
并重写所需的运算符来获得一个接近的近似。下面是一个大致的草图:
class vector(tuple):
def __add__(self, other):
return type(self)(l+r for l, r in zip(self, other))
def __sub__(self, other):
return type(self)(l-r for l, r in zip(self, other))
def __radd__(self, other):
return type(self)(l+r for l, r in zip(self, other))
def __lsub__(self, other):
return type(self)(r-l for l, r in zip(self, other))
from collections import defaultdict
d = defaultdict(lambda:vector((0, 0.0)))
for k in range(5):
for j in range(5):
d[k] += (j, j+k)
print d
我们不需要(也不想)实际重载+=
运算符本身(即__iadd__
),因为tuple
是不可变的。如果你提供了加法,Python会正确地用新值替换旧值。