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__
メソッドがそのように機能するように定義されているため、そのように機能することはわかっています。それで、唯一の方法はそれらを再定義することですか?
import operator
tuple(map(operator.add, a, b))
すべての組み込みを使用して..
tuple(map(sum, zip(a, b)))
このソリューションはインポートを必要としません:
tuple(map(lambda x, y: x + y, tuple1, tuple2))
from numpy import array
a = array( [1,2,3] )
b = array( [3,2,1] )
print a + b
を与えarray([4,4,4])
ます。
タプルを返すように、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
サブクラス化を容易にします。
マップの代わりにジェネレータ内包表記を使用できます。組み込みのマップ関数は時代遅れではありませんが、リスト/ジェネレーター/ディクテーションの理解よりもほとんどの人にとって読みにくいため、一般的にマップ関数を使用しないことをお勧めします。
tuple(p+q for p, q in zip(a, b))
タプルを返すクラス定義のない単純なソリューション
import operator
tuple(map(operator.add,a,b))
すべてのジェネレーター ソリューション。パフォーマンスについては不明です(ただし、itertoolsは高速です)
import itertools
tuple(x+y for x, y in itertools.izip(a,b))
はい。ただし、組み込み型を再定義することはできません。それらをサブクラス化する必要があります:
クラス MyTuple(タプル): def __add__(自分、その他): if len(self) != len(other): Raise ValueError("タプルの長さが一致しません") return MyTuple(x + y for (x, y) in zip(self, other))
すでに を使用している場合の別の便利なソリューションを次に示しますnumpy
。コンパクトで、加算演算を任意のnumpy 式に置き換えることができます。
import numpy as np
tuple(np.array(a) + b)