Элементарные кортежные операции Python, такие как sum - PullRequest
89 голосов
/ 31 января 2009

Есть ли способ заставить кортежные операции в 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 ]

118 голосов
/ 31 января 2009
import operator
tuple(map(operator.add, a, b))
96 голосов
/ 31 января 2009

Использование всех встроенных модулей ..

tuple(map(sum, zip(a, b)))
30 голосов
/ 03 октября 2012

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

tuple(map(lambda x, y: x + y, tuple1, tuple2))
19 голосов
/ 31 января 2009

Сочетание первых двух ответов с настройкой кода 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 для упрощения подклассов.

17 голосов
/ 01 февраля 2009
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

9 голосов
/ 14 января 2016

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

tuple(p+q for p, q in zip(a, b))
6 голосов
/ 27 сентября 2012

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

import itertools
tuple(x+y for x, y in itertools.izip(a,b))
6 голосов
/ 24 июня 2010

простое решение без определения класса, которое возвращает кортеж

import operator
tuple(map(operator.add,a,b))
3 голосов
/ 31 января 2009

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

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))
1 голос
/ 13 июня 2016

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

>>> tuple(sum(i) for i in zip((1, 2, 3), (3, 2, 1)))
(4, 4, 4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...