如何添加元组

时间:2011-04-09 19:28:26

标签: python algorithm tuples

我有这样的伪代码:

if( b < a)
   return (1,0)+foo(a-b,b)

我想用python编写它。但python可以添加元组吗?编写类似代码的最佳方法是什么?

4 个答案:

答案 0 :(得分:12)

我会去

>>> map(sum, zip((1, 2), (3, 4)))
[4, 6]

或更自然地:

>>> numpy.array((1, 2)) + numpy.array((3, 4))
array([4, 6])

答案 1 :(得分:11)

你想做元素添加,还是附加元组?默认情况下,python会

(1,2)+(3,4) = (1,2,3,4)

您可以将自己定义为:

def myadd(x,y):
     z = []
     for i in range(len(x)):
         z.append(x[i]+y[i])
     return tuple(z)

此外,正如@ delnan的评论所表明的那样,这更好地写成

def myadd(xs,ys):
     return tuple(x + y for x, y in izip(xs, ys))

或甚至更多功能:

myadd = lambda xs,ys: tuple(x + y for x, y in izip(xs, ys))

然后做

if( b < a) return myadd((1,0),foo(a-b,b))

答案 2 :(得分:2)

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

与highBandWidth的答案相反,这种方法要求元组在Python 2.7或更早版本中具有相同的长度,而不是引发TypeError。在Python 3中,map略有不同,因此结果是总和的元组,其长度等于ab的较短者。

如果您想在Python 2中使用截断行为,可以将map替换为itertools.imap

tuple(itertools.imap(operator.add, a, b))

答案 3 :(得分:2)

如果您希望+本身以这种方式行事,您可以继承tuple并覆盖添加:

class mytup(tuple):
    def __add__(self, other):
        if len(self) != len(other):
             return NotImplemented # or raise an error, whatever you prefer
         else:
             return mytup(x+y for x,y in izip(self,other))

同样适用于__sub____mul____div____gt__(元素>)等。有关这些特殊运营商的更多信息,例如: here (numeric operations)here (comparisions)

您仍然可以通过调用原始元组添加来追加元组:tuple.__add__(a,b)而不是a+b。或者在新类中定义append()函数来执行此操作。