sum과 같은 Python 요소 별 튜플 연산


99

어쨌든 다음과 같이 작동하도록 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__메서드가 그렇게 작동하도록 정의되어 있기 때문에 그렇게 작동한다는 것을 알고 있습니다 . 그래서 유일한 방법은 그것들을 재정의하는 것입니까?

답변:


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

4
이것이 가장 비단뱀적인 해결책이라고 말하고 싶습니다.
Matthew Schinckel

3
단, map ()은 더 이상 사용되지 않습니다. 지도가 목록 이해력으로 더 잘 작성되는 방법을 언급하는 Guido의 기사는 artima.com/weblogs/viewpost.jsp?thread=98196 을 참조하십시오 .
Adam Parkin 2012

a와 b가 같은 수의 요소를 포함하지 않거나 "추가 가능"하지 않은 경우에도 폭발합니다 (예 :map(operator.add, (1,2), ("3", "4"))
Adam Parkin

22
tuple([item1 + item2 for item1, item2 in zip(a, b)])목록 이해력과 동일합니다.
Adam Parkin

11
@AdamParkin, 생성기 이해도가 훨씬 더 좋습니다 tuple(item1 + item2 for item1, item2 in zip(a, b)).
Cristian Ciupitu 2016

118

모든 내장 사용 ..

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

2
이것은 더 간단하고 우수한 대답 인 것 같습니다. 왜 허용되지 않습니까?
Marc Cenedella 2013

15
그것은 좋지만 기술적으로는 맵이 튜플이 아닌리스트를 반환하기 때문에 요구되는 것이 아닙니다. 그래서 :tuple(map(sum,zip(a,b))
Ben

3
구문은 신비합니다.
anatoly techtonik

2
이것의 장점은 당신이 그것을 확장 할 수 있다는 것입니다 :tuple(map(sum,zip(a,b, c))
앤디 헤이든

32

이 솔루션에는 가져 오기가 필요하지 않습니다.

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

2
이 솔루션은 다른 가져 오기없는 단일 라이너 솔루션 ( map(sum, zip(a, b))) 보다 빠릅니다
Air

20

처음 두 답변을 결합하여 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하위 클래스를 쉽게 만들 수 있습니다.



11

지도 대신 생성기 이해도를 사용할 수 있습니다. 내장 된지도 기능은 구식이 아니지만 대부분의 사람들이 목록 / 생성기 / 딕셔너리 이해보다 가독성이 떨어지기 때문에 일반적으로지도 기능을 사용하지 않는 것이 좋습니다.

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

6

튜플을 반환하는 클래스 정의가없는 간단한 솔루션

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

6

모든 발전기 솔루션. 성능이 확실하지 않음 (itertools는 빠르지 만)

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

3

예. 그러나 내장 유형을 재정의 할 수는 없습니다. 다음과 같이 하위 클래스를 지정해야합니다.

클래스 MyTuple (튜플) :
    def __add __ (자신, 기타) :
         len (self)! = len (other) :
             ValueError ( "튜플 길이가 일치하지 않음")
         return MyTuple (x + y for (x, y) in zip (self, other))

하지만 튜플 구문을 사용할 수 없습니다.
airportyh

3

더 간단하고지도를 사용하지 않고도 할 수 있습니다.

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

1

저는 현재 "tuple"클래스를 하위 클래스로 지정하여 +,-및 *를 오버로드합니다. 나는 그것이 코드를 아름답게 만들고 코드를 더 쉽게 작성한다는 것을 알았습니다.

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)

-1

누군가 튜플 목록을 평균화해야하는 경우 :

import operator 
from functools import reduce
tuple(reduce(lambda x, y: tuple(map(operator.add, x, y)),list_of_tuples))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.