Python元素明智的元组操作,如sum

无论如何,Python中的元组操作就像这样工作:

>>> a = (1,2,3) >>> b = (3,2,1) >>> a + b (4,4,4) 

代替:

 >>> a = (1,2,3) >>> b = (3,2,1) >>> a + b (1,2,3,3,2,1) 

我知道它是这样工作的,因为__add____mul__方法被定义为像那样工作。 那么唯一的办法就是重新定义它们?

 import operator tuple(map(operator.add, a, b)) 

使用所有内置程序

 tuple(map(sum, zip(a, b))) 

该解决scheme不需要导入:

 tuple(map(lambda x, y: x + y, tuple1, tuple2)) 

将前两个答案组合在一起,对ironfroggy的代码进行调整,以便返回一个元组:

 import operator class stuple(tuple): def __add__(self, other): return self.__class__(map(operator.add, self, other)) # obviously leaving out checking lengths >>> a = stuple([1,2,3]) >>> b = stuple([3,2,1]) >>> a + b (4, 4, 4) 

注意:使用self.__class__而不是stuple来简化子类。

 from numpy import * a = array( [1,2,3] ) b = array( [3,2,1] ) print a + b 

给出array([4,4,4])

请参阅http://www.scipy.org/Tentative_NumPy_Tutorial

所有发电机解决 不确定性能(虽然itertools是快速的)

 import itertools tuple(x+y for x, y in itertools.izip(a,b)) 

没有返回元组的类定义的简单解决scheme

 import operator tuple(map(operator.add,a,b)) 

可以使用生成器理解来代替映射。 内置地图function并不是过时的,但是对于大多数人来说,它比列表/发生器/字典理解的可读性差,所以我build议不要使用一般的地图function。

 tuple(p+q for p, q in zip(a, b)) 

是。 但是你不能重新定义内置的types。 你必须inheritance它们:

类MyTuple(元组):
     def __add __(self,other):
         如果len(self)!= len(other):
             提高ValueError(“元组长度不匹配”)
         返回MyTuple(x + y为zip(self,other)中的(x,y))

甚至更简单,不使用地图,你可以做到这一点

 >>> tuple(sum(i) for i in zip((1, 2, 3), (3, 2, 1))) (4, 4, 4)