2010-09-27 15 views
5

Comment puis-je obtenir la somme par paires de deux tuples de longueur égale? Par exemple si j'ai (0, -1,7) et (3,4, -7) je voudrais avoir (3,3,0) comme réponse.Comment puis-je sommer par paires deux tuples de longueur égale

+3

Un double d'une question posée un an et demi auparavant, qui n'a pas reçu de bonnes réponses semble bien. Toutes les réponses sont basées sur des cartes, ce qui est beaucoup moins propre qu'une expression de compréhension/génération de liste (ci-dessous). La réponse acceptée dans celui-là est bien pire - le fait de passer outre une classe juste pour exécuter une méthode n'a aucun sens. –

+0

Je suppose que la raison de la réponse acceptée dans cette question est parce que c'est le comportement bizarre particulier que la question a demandé, donc ce n'est pas vraiment la faute du répondeur. –

Répondre

11
tuple(map(lambda (x, y): x + y, zip((0,-1,7), (3,4,-7)))) 

Si vous préférez éviter map et lambda alors vous pouvez faire:

tuple(x + y for x,y in zip((0,-1,7), (3,4,-7))) 

EDIT: Comme l'une des réponses a souligné, vous pouvez utiliser la somme au lieu de diviser explicitement les tuples retournés par zip. Par conséquent, vous pouvez réécrire l'exemple de code ci-dessus comme indiqué ci-dessous:

tuple(sum(t) for t in zip((0,-1,7), (3,4,-7))) 

Référence: zip, map, sum.

+0

La compréhension de la liste est généralement préférable. C'est beaucoup plus intuitif immédiatement que toutes les réponses fonctionnelles dans # 497885. –

+0

@Glenn: convenu. Cela dit, je trouve qu'il est plus facile de penser d'abord en termes de carte et de filtre, puis de le mapper (sans jeu de mots: P) à une compréhension de liste. –

+0

Je suis l'inverse: les compréhensions de listes (dans ce cas, les expressions de générateur, en fait) me sont naturellement intuitives, mais je dois penser à la carte - probablement parce qu'elle est beaucoup moins utilisée en Python. –

4
>>> t1 = (0,-1,7) 
>>> t2 = (3,4,-7) 
>>> tuple(i + j for i, j in zip(t1, t2)) 
(3, 3, 0) 
3

Sinon (bon si vous avez très grands tuples ou vous envisagez de faire d'autres opérations mathématiques avec eux):

> import numpy as np 
> t1 = (0, -1, 7) 
> t2 = (3, 4, -7) 
> at1 = np.array(t1) 
> at2 = np.array(t2) 
> tuple(at1 + at2) 
(3, 3, 0) 

Inconvénients: plus la préparation des données est nécessaire. Pourrait être excessif dans la plupart des cas.

Avantages: les opérations sont très explicites et isolées. Probablement très rapide avec de gros tuples.

6

somme Utilisation():

>>> tuple(sum(pair) for pair in zip((0,-1,7), (3,4,-7))) 

ou

>>> tuple(map(sum, zip((0,-1,7), (3,4,-7)))) 
+0

'tuple (map (operator.add, (0, -1, 7), (3, 4, -7)))' –