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])
。
所有发电机解决 不确定性能(虽然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)