web-dev-qa-db-ja.com

pythonで2つのリストを減算する方法

pythonこれを計算できる関数を作成する方法がわかりません:

List1=[3,5,6]
List2=[3,7,2]

結果は、List1からList2を減算する新しいリストになりますList3=[0,-2,4]!どういうわけか私はZip関数を使わなければならないことを知っています。そうすることで、次のようになります:([(3,3), (5,7), (6,2)])、でも今何をしたらいいのかわかりませんか?

13
Linus Svendsson

これを試して:

[x1 - x2 for (x1, x2) in Zip(List1, List2)]

これはZipを使用し、内包表記をリストし、構造化解除します。

21
Matt Fenwick

このソリューションでは numpy を使用します。 numpy配列のインスタンス化にはある程度のオーバーヘッドがあるため、これは単純なリストに対してのみ意味があります。 OTOH、短いリスト以外では、これはものすごく速くなります。

>>> import numpy as np
>>> a = [3,5,6]
>>> b = [3,7,2]
>>> list(np.array(a) - np.array(b))
[0, -2, 4]
12
mac

@Mattが示唆するように、 list comprehension を使用できます。 itertools -より具体的には、imap()関数を使用することもできます。

>>> from itertools import imap
>>> from operator import sub
>>> a = [3,5,6]
>>> b = [3,7,2]
>>> imap(int.__sub__, a, b)
<itertools.imap object at 0x50e1b0>
>>> for i in imap(int.__sub__, a, b):
...     print i
... 
0
-2
4

すべてのitertools関数と同様に、imap()はイテレータを返します。 list()コンストラクターのパラメーターとして渡すリストを生成できます。

>>> list(imap(int.__sub__, a, b))
[0, -2, 4]
>>> list(imap(lambda m, n: m-n, a, b)) # Using lambda
[0, -2, 4]

[〜#〜] edit [〜#〜]:以下の@Catで提案されているように、operator.sub()を使用することをお勧めしますimap()を使用した関数:

>>> from operator import sub
>>> list(imap(sub, a, b))
[0, -2, 4]
6
brandizzi

以下のさらに別の解決策:

>>> a = [3,5,6]
>>> b = [3,7,2]
>>> list(map(int.__sub__, a, b)) # for python3.x
[0, -2, 4]
>>> map(int.__sub__, a, b) # and for python2.x
[0, -2, 4]

ADDITION:python reference of map を確認するだけで、それ以上を渡すことができますmapに対して反復可能なもの

3
starrify

あなたは次の方法でそれを行うことができます

List1 = [3,5,6]
List2 = [3,7,2]
ans = [List1[i]-List2[i] for i in xrange(min(len(List1), len(List2)))]
print ans

[0, -2, 4]を出力します

1