如何通过一个循环传递对多个对象属性求和(make totals)?

时间:2015-08-16 13:20:13

标签: python python-2.7

我想在一个循环中一次总结多个属性:

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])

2 个答案:

答案 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个属性,在维度中进行硬连线可能更有效,因为函数调用开销较少。