Операции с элементами типа Python, такие как сумма

В любом случае, чтобы заставить кортежи в 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__ определены так, чтобы работать так. Итак, единственный способ - переопределить их?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Сортировка первых двух ответов с настройкой на железо-фрикционный код, чтобы он возвращал кортеж:

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 для облегчения подклассов.

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

В настоящее время я подкласс класса "кортеж" для перегрузки +, - и *. Я считаю, что это делает код красивым и написание кода проще.

class tupleN(tuple):
    def __add__(self, other):
        if len(self) != len(other):
             return NotImplemented
        else:
             return tupleN(x+y for x,y in zip(self,other))
    def __sub__(self, other):
        if len(self) != len(other):
             return NotImplemented
        else:
             return tupleN(x-y for x,y in zip(self,other))
    def __mul__(self, other):
        if len(self) != len(other):
             return NotImplemented
        else:
             return tupleN(x*y for x,y in zip(self,other))


t1 = tupleN((1,3,3))
t2 = tupleN((1,3,4))
print(t1 + t2, t1 - t2, t1 * t2, t1 + t1 - t1 - t1)
(2, 6, 7) (0, 0, -1) (1, 9, 12) (0, 0, 0)

Ответ 12

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

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