これを計算できるPythonで関数を作成する方法がわかりません:
List1=[3,5,6]
List2=[3,7,2]
結果は、List1 から List2 を引いた新しいリストになりますList3=[0,-2,4]。私はどういうわけかzip関数を使用しなければならないことを知っています。そうすることで:
([(3,3), (5,7), (6,2)])が得られますが、今何をすべきかわかりませんか?
これを計算できる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]
以下のさらに別の解決策:
>>> 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]
追加:のpython 参照をmap確認するだけで、複数の iterable を に渡すことができることがわかります。map
@Matt が提案したように、リスト内包表記を使用できます。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]
次の方法でそれを行うことができます
List1 = [3,5,6]
List2 = [3,7,2]
ans = [List1[i]-List2[i] for i in range(min(len(List1), len(List2)))]
print ans
それが出力する[0, -2, 4]