我想在一个循环中一次总结多个属性:
class Some(object):
def __init__(self, acounter, bcounter):
self.acounter = acounter
self.bcounter = bcounter
someList = [Some(x, x) for x in range(10)]
我可以做一些比它更简单,更快速的事情吗?
atotal = sum([x.acounter for x in someList])
btotal = sum([x.bcounter for x in someList])
答案 0 :(得分:3)
另一种选择(可能不会更快)是为您的类重载加法运算符:
class Some(object):
def __init__(self, acounter, bcounter):
self.acounter = acounter
self.bcounter = bcounter
def __add__(self, other):
if isinstance(other, self.__class__):
return Some(self.acounter+other.acounter, self.bcounter+other.bcounter)
elif isinstance(other, int):
return self
else:
raise TypeError("useful message")
__radd__ = __add__
somelist = [Some(x, x) for x in range(10)]
combined = sum(somelist)
print combined.acounter
print combined.bcounter
这种方式sum
会返回Some
个对象。
答案 1 :(得分:1)
我怀疑这真的更快,但你可以这样做:
首先通过以下方式定义padd
(对于“pair add”):
def padd(p1,p2):
return (p1[0]+p2[0],p1[1]+p2[1])
例如,padd((1,4), (5,10)) = (6,14)
然后使用reduce
:
atotal, btotal = reduce(padd, ((x.acounter,x.bcounter) for x in someList))
在Python 3中,您需要从reduce
导入functools
,但是IIRC可以直接在Python 2中使用。
在编辑时:对于2个以上的属性,您可以将padd
替换为vadd
(“vector add”),它可以处理任意维度的元组:
def vadd(v1,v2):
return tuple(x+y for x,y in zip(v1,v2))
对于2个属性,在维度中进行硬连线可能更有效,因为函数调用开销较少。