130

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

4

14 に答える 14

159
import operator
tuple(map(operator.add, a, b))
于 2009-01-31T00:55:01.313 に答える
149

すべての組み込みを使用して..

tuple(map(sum, zip(a, b)))
于 2009-01-31T02:49:16.993 に答える
38

このソリューションはインポートを必要としません:

tuple(map(lambda x, y: x + y, tuple1, tuple2))
于 2012-10-03T06:20:20.357 に答える
21
from numpy import array

a = array( [1,2,3] )
b = array( [3,2,1] )

print a + b

を与えarray([4,4,4])ます。

http://www.scipy.org/Tentative_NumPy_Tutorialを参照してください

于 2009-01-31T22:25:06.467 に答える
20

タプルを返すように、ironfroggy のコードを微調整して、最初の 2 つの回答を組み合わせたようなものです。

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サブクラス化を容易にします。

于 2009-01-31T01:10:18.303 に答える
17

マップの代わりにジェネレータ内包表記を使用できます。組み込みのマップ関数は時代遅れではありませんが、リスト/ジェネレーター/ディクテーションの理解よりもほとんどの人にとって読みにくいため、一般的にマップ関数を使用しないことをお勧めします。

tuple(p+q for p, q in zip(a, b))
于 2016-01-14T20:22:45.280 に答える
6

タプルを返すクラス定義のない単純なソリューション

import operator
tuple(map(operator.add,a,b))
于 2010-06-24T16:10:24.917 に答える
6

すべてのジェネレーター ソリューション。パフォーマンスについては不明です(ただし、itertoolsは高速です)

import itertools
tuple(x+y for x, y in itertools.izip(a,b))
于 2012-09-26T21:25:32.603 に答える
3

はい。ただし、組み込み型を再定義することはできません。それらをサブクラス化する必要があります:

クラス MyTuple(タプル):
    def __add__(自分、その他):
         if len(self) != len(other):
             Raise ValueError("タプルの長さが一致しません")
         return MyTuple(x + y for (x, y) in zip(self, other))
于 2009-01-31T00:55:54.213 に答える
0

すでに を使用している場合の別の便利なソリューションを次に示しますnumpy。コンパクトで、加算演算を任意のnumpy 式に置き換えることができます。

import numpy as np
tuple(np.array(a) + b)
于 2020-12-17T16:23:46.943 に答える