pythonこれを計算できる関数を作成する方法がわかりません:
List1=[3,5,6]
List2=[3,7,2]
結果は、List1からList2を減算する新しいリストになりますList3=[0,-2,4]
!どういうわけか私はZip関数を使わなければならないことを知っています。そうすることで、次のようになります:([(3,3), (5,7), (6,2)])
、でも今何をしたらいいのかわかりませんか?
これを試して:
[x1 - x2 for (x1, x2) in Zip(List1, List2)]
これはZip
を使用し、内包表記をリストし、構造化解除します。
このソリューションでは 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]
@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]
以下のさらに別の解決策:
>>> 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
に対して反復可能なもの
あなたは次の方法でそれを行うことができます
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]
を出力します