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__and __mul__メソッドはそのように機能するように定義されているため、私はそれがそのように機能することを知っています。したがって、唯一の方法はそれらを再定義することでしょうか?

回答:


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

4
これが最もpythonicソリューションだと思います。
マシュー・シンケル2009年

3
ただし、map()は推奨されません。Guidoによる記事については、artima.com / weblogs / viewpost.jsp?thread = 98196を参照してください。この記事では、マップがリスト内包としてどのように記述されているかについて言及しています。
アダムパーキン

また、aとbに同じ数の要素が含まれていない場合、または「追加可能」でない場合も爆破します(例:map(operator.add, (1,2), ("3", "4"))
Adam Parkin、

22
tuple([item1 + item2 for item1, item2 in zip(a, b)])リスト内包表記と同等です。
アダムパーキン

11
@AdamParkin、ジェネレーターの理解はさらに優れていtuple(item1 + item2 for item1, item2 in zip(a, b))ます。
クリスティアンCiupitu 2016年

118

すべての組み込み機能を使用しています。

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

2
これは、よりシンプルで優れた答えのようです。なぜ受け入れられないのですか?
Marc Cenedella 2013

15
それは良いですが、マップはタプルではなくリストを返すので、厳密には要求されたものではありません...それで、tuple(map(sum,zip(a,b))
Ben

3
構文は神秘的です。
anatly techtonik 2014

2
:この1の利点は、あなたがそれを拡張することができるということです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

最初の2つの答えを組み合わせたもので、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(tuple):
    def __add __(self、other):
         if len(self)!= len(other):
             ValueErrorを発生させます( "タプルの長さが一致しません")
         MyTuple(x + y for(x、y)in zip(self、other))を返す

ただし、タプル構文は使用できません。
Airportyh 2009年

3

地図を使わなくても、もっと簡単にできます

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

1

現在、「タプル」クラスをサブクラス化して、+、-、および*をオーバーロードしています。私はそれがコードを美しくし、コードを書くことをより簡単にすることがわかりました。

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.