开发者

How to add with tuples

开发者 https://www.devze.com 2023-02-23 01:22 出处:网络
I have pseudo-code like this: if( b < a) return (1,0)+foo(开发者_运维知识库a-b,b) I want to write it in python. But can python add tuples? What is the best way to code something like that?I\'d g

I have pseudo-code like this:

if( b < a)
   return (1,0)+foo(开发者_运维知识库a-b,b)

I want to write it in python. But can python add tuples? What is the best way to code something like that?


I'd go for

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

or, more naturally:

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


Do you want to do element-wise addition, or to append the tuples? By default python does

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

You could define your own as:

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

Also, as @delnan's comment makes it clear, this is better written as

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

or even more functionally:

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

Then do

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


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

In contrast to the answer by highBandWidth, this approach requires that the tuples be of the same length in Python 2.7 or earlier, instead raising a TypeError. In Python 3, map is slightly different, so that the result is a tuple of sums with length equal to the shorter of a and b.

If you want the truncation behavior in Python 2, you can replace map with itertools.imap:

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


If you want + itself to act this way, you could subclass tuple and override the addition:

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

The same goes for __sub__, __mul__, __div__, __gt__ (elementwise >) etc. More information on these special operators can be found e.g. here (numeric operations) and here (comparisions)

You can still append tuples by calling the original tuple addition: tuple.__add__(a,b) instead of a+b. Or define an append() function in the new class to do this.

0

精彩评论

暂无评论...
验证码 换一张
取 消