How to add with tuples
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))
Related videos on Youtube
Comments
-
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 about 13 years
tuple(x + y for x, y in izip(xs, ys))
. -
fpointbin about 13 yearsexactly i wanna do something like 'myadd' this is the best way?
-
highBandWidth about 13 yearsYes, and delnan's comment is more pithy.
-
Michael J. Barber over 11 yearsIf 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 about 7 yearsdo dig the style but does require another import.
-
jitter about 7 yearsworks - but having to import numpy might be overkill for tiny codes.