Операции кортежа 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 ответов:
как бы объединил первые два ответа, с настройкой кода 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
для облегчения подклассов.
понимание генератора может быть использовано вместо карты. Встроенная функция 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))