Операции кортежа Python по элементам, такие как sum


есть ли в любом случае, чтобы заставить операции кортежа в Python работать так:

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

вместо:

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

Я знаю, что это работает, потому что __add__ и __mul__ методы определены для такой работы. Значит, единственный способ-это переопределить их?

11 77

11 ответов:

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

используя все встроенные модули..

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

Это решение не требует импорта:

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

как бы объединил первые два ответа, с настройкой кода ironfroggy, чтобы он возвращал кортеж:

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)

Примечание: с помощью self.__class__ вместо stuple для облегчения подклассов.

from numpy import *

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

print a + b

дает array([4,4,4]).

см.http://www.scipy.org/Tentative_NumPy_Tutorial

понимание генератора может быть использовано вместо карты. Встроенная функция map не устарела, но она менее читаема для большинства людей, чем понимание списка/генератора/диктатора, поэтому я бы рекомендовал не использовать функцию map вообще.

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

все решения генератора. Не уверен в производительности (itertools быстро, хотя)

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

простое решение без определения класса, который возвращает объект tuple

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

да. Но вы не можете переопределить встроенные типы. Вы должны подкласс их:

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

даже проще и без использования карты, вы можете сделать это

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

в случае, если кому-то нужно усреднить список кортежей:

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