How to add with tuples

27,627

Solution 1

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

Solution 2

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

Solution 3

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.

Solution 4

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))
Share:
27,627

Related videos on Youtube

fpointbin
Author by

fpointbin

Languages: C/C++ - Python - Pascal

Updated on April 10, 2020

Comments

  • fpointbin
    fpointbin about 4 years

    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?

  • Admin
    Admin about 13 years
    tuple(x + y for x, y in izip(xs, ys)).
  • fpointbin
    fpointbin about 13 years
    exactly i wanna do something like 'myadd' this is the best way?
  • highBandWidth
    highBandWidth about 13 years
    Yes, and delnan's comment is more pithy.
  • Michael J. Barber
    Michael J. Barber over 11 years
    If the tuples are of different lengths, your myadd will silently truncate the longer tuple to the length of the shorter. This may or may not be a problem.
  • jitter
    jitter about 7 years
    do dig the style but does require another import.
  • jitter
    jitter about 7 years
    works - but having to import numpy might be overkill for tiny codes.

Related