2009-01-31 19 views
73

Esiste un modo per ottenere le operazioni di tuple in Python per lavorare in questo modo:Python elemento saggi come somma

>>> a = (1,2,3) 
>>> b = (3,2,1) 
>>> a + b 
(4,4,4) 

invece di:

>>> a = (1,2,3) 
>>> b = (3,2,1) 
>>> a + b 
(1,2,3,3,2,1) 

so che funziona così perché il I metodi __add__ e __mul__ sono definiti per funzionare in questo modo. Quindi l'unico modo sarebbe ridefinirli?

risposta

102
import operator 
tuple(map(operator.add, a, b)) 
+4

direi che questo è il più soluzione pitonica. –

+2

Tranne che map() è semi-deprecato. Vedi http://www.artima.com/weblogs/viewpost.jsp?thread=98196 per un articolo di Guido in cui si menziona come la mappa sia scritta meglio come una lista di comprensione. –

+0

Scoppia anche se a & b non contengono lo stesso numero di elementi, o non sono "addable" (es: 'map (operator.add, (1,2), (" 3 "," 4 ")) ' –

3

Sì. Ma non puoi ridefinire i tipi predefiniti. Bisogna sottoclasse loro:

 
class MyTuple(tuple): 
    def __add__(self, other): 
     if len(self) != len(other): 
      raise ValueError("tuple lengths don't match") 
     return MyTuple(x + y for (x, y) in zip(self, other)) 
+0

ma non è possibile utilizzare la sintassi della tupla. – airportyh

19

sorta di combinazione delle prime due risposte, con un tweak per il codice di ironfroggy in modo che restituisca una tupla:

import operator 

class stuple(tuple): 
    def __add__(self, other): 
     return self.__class__(map(operator.add, self, other)) 
     # obviously leaving out checking lengths 

>>> a = stuple([1,2,3]) 
>>> b = stuple([3,2,1]) 
>>> a + b 
(4, 4, 4) 

Nota: usando self.__class__ invece di stuple per facilitare sottoclassi.

78

Utilizzando tutti built-in ..

tuple(map(sum, zip(a, b))) 
+0

Questa sembra la risposta più semplice e superiore. Perché non è accettato? –

+15

è buono, ma tecnicamente non è quello che viene richiesto perché la mappa restituisce un elenco, non una tupla ... quindi: 'tupla (mappa (somma, zip (a, b))' – Ben

+3

La sintassi è mistica. –

15
from numpy import * 

a = array([1,2,3]) 
b = array([3,2,1]) 

print a + b 

array([4,4,4]).

Vedi http://www.scipy.org/Tentative_NumPy_Tutorial

+5

Funzionerà, ma è un po 'pesante importare numpy solo per un semplice operazione di addizione: –

5

soluzione semplice senza definizione di classe che restituisce tupla

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

Tutto soluzione generatore. Non è sicuro sulle prestazioni (itertools é veloce, però)

import itertools 
tuple(x+y for x, y in itertools.izip(a,b)) 
27

Questa soluzione non richiede un'importazione:

tuple(map(lambda x, y: x + y, tuple1, tuple2)) 
+1

Questa soluzione è anche più veloce di un'altra soluzione di importazione singola, senza carta ('map (sum, zip (a, b))') – Air

7

Generator comprensione potrebbe essere usato al posto di carta. La funzione mappa incorporata non è obsoleta ma è meno leggibile per la maggior parte delle persone rispetto alla comprensione list/generator/dict, quindi consiglierei di non usare la funzione map in generale.

tuple(p+q for p, q in zip(a, b)) 
0

ancora più semplice e senza l'utilizzo di carta, è possibile farlo

>>> tuple(sum(i) for i in zip((1, 2, 3), (3, 2, 1))) 
(4, 4, 4) 
0

Nel caso qualcuno bisogno di una media di una lista di tuple:

import operator 
from functools import reduce 
tuple(reduce(lambda x, y: tuple(map(operator.add, x, y)),list_of_tuples)) 
Problemi correlati