23

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

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

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

4

5 に答える 5

37

これを試して:

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

これはzip、リスト内包表記、および分解を使用します。

于 2011-11-19T12:54:10.767 に答える
18

このソリューションは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]
于 2011-11-19T14:11:13.843 に答える
6

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

>>> 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

于 2011-11-19T13:15:53.900 に答える
6

@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]
于 2011-11-19T13:09:26.100 に答える
1

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

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]

于 2016-06-02T17:54:17.323 に答える