Python 元素元组操作,如 sum

在 Python 中是否存在这样的 tuple 操作:

>>> 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__方法就是这样定义的。所以唯一的办法就是重新定义它们?

156165 次浏览
import operator
tuple(map(operator.add, a, b))

是的。但是您不能重新定义内置类型。您必须对它们进行子类化:

class MyTuple(tuple):
def __add__(self, other):
if len(self) != len(other):
raise ValueError("tuple lengths don't match")
return MyTuple(x + y for (x, y) in zip(self, other))

类似于将前两个答案结合起来,对 iron Froggy 的代码进行调整,以便返回一个 tuple:

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来简化子类化。

使用所有内置的. 。

tuple(map(sum, zip(a, b)))
from numpy import array


a = array( [1,2,3] )
b = array( [3,2,1] )


print a + b

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

参见 http://www.scipy.org/Tentative_NumPy_Tutorial

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

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

所有的生成器解决方案。性能不确定(尽管 itertools 很快)

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

这个解决方案不需要导入:

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

可以使用生成器理解代替映射。内置的 map 函数并没有过时,但是对于大多数人来说,它的可读性比列表/生成器/结论理解要差,所以我建议一般不要使用 map 函数。

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

甚至更简单,不需要使用 map,你就可以做到这一点

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

以防有人需要对元组列表求平均值:

import operator
from functools import reduce
tuple(reduce(lambda x, y: tuple(map(operator.add, x, y)),list_of_tuples))

我当前子类化了“ tuple”类来重载 + 、-和 * 。我发现它使代码更漂亮,编写代码也更容易。

class tupleN(tuple):
def __add__(self, other):
if len(self) != len(other):
return NotImplemented
else:
return tupleN(x+y for x,y in zip(self,other))
def __sub__(self, other):
if len(self) != len(other):
return NotImplemented
else:
return tupleN(x-y for x,y in zip(self,other))
def __mul__(self, other):
if len(self) != len(other):
return NotImplemented
else:
return tupleN(x*y for x,y in zip(self,other))




t1 = tupleN((1,3,3))
t2 = tupleN((1,3,4))
print(t1 + t2, t1 - t2, t1 * t2, t1 + t1 - t1 - t1)
(2, 6, 7) (0, 0, -1) (1, 9, 12) (0, 0, 0)

如果您已经在使用 numpy,这里是另一个方便的解决方案。 该算法结构紧凑,加法运算可用 任何数字表达式代替。

import numpy as np
tuple(np.array(a) + b)

我不断回到这个问题,我不特别喜欢任何一个答案,因为它们都在回答一般情况下的问题,我通常在寻找一个特殊情况的答案: 我通常使用一个固定的元组计数,例如 n 维。

   # eg adding a dx/dy to an xy point.
# if I have a point xy and another point dxdy
x, y = xy
dx, dy = dxdy
return x+dx, y+dy

虽然我通常对不必要的变量感到不安,但是我解压元组的原因通常是因为我将元素作为个体来处理,这就是上面要求的元组添加所发生的情况。