3

Python で次のことを行うにはどうすればよいですか。

array_1 = [x1, x2, x3, x4, x5, x6, ....]
array_2 = [y1, y2, y3]

array_3 = [(x1-y1), (x2-y2), (x3-y3), (x4-y1), (x5-y2), (x6-y3)]

の要素数array_2は常に の要素数より少なくなりarray_1ます。

array_1array_2任意の数の要素を持ちます。

[num of elements in array_1]モッド[number of elements in array_2]= 0

4

3 に答える 3

10
from itertools import izip, cycle

array_3 = [a - b for a, b in izip(array_1, cycle(array_2))]

これは、array_2 の任意のサイズに対応します。

ここでitertools.izip()は、両方のリストの要素を組み合わせてペアにし、itertools.cycle()ユーティリティは 2 番目のリストを何度も再利用して、ペアにするものを提供します。

出力としてリストを必要とせず、結果を反復処理するだけでよい場合は、itertools.imap()andoperator.subも使用できます。

from itertools import imap, cycle
import operator

for result in imap(operator.sub, array_1, cycle(array_2)):
    # do something with the result

大きな入力リストの場合、これにより、中間結果をさらに別のリストに保存する必要がなくなります。

于 2013-02-18T15:31:43.943 に答える
6

Itertoolsには、問題に対応するためのツールがたくさんあります

問題を理解する

  1. 配列の 1 つが他の配列よりも短くなっています
  2. 短い配列は、長い配列が使い果たされるまで循環する必要があります
  3. 長い方の配列と循環する短い方の配列のペアを作成します
  4. ペア内の要素を減算します

だからここに実装があります

>>> arr1 = range(1,10)
>>> arr2 = range(20,23)
>>> from operator import sub
>>> from itertools import izip, cycle, starmap
>>> list(starmap(sub, izip(arr1, cycle(arr2))))
[-19, -19, -19, -16, -16, -16, -13, -13, -13]
于 2013-02-18T15:32:42.957 に答える
5

operator.subで使用できますmap

array_3 = map(operator.sub,array_1,array_2+array_2)

または、次のようにすることもできますzip

array_3 = [x-y for x,y in zip(array_1,array2+array2)]

また、 itertools.cycle を使用して、 array2とそれ自体のばかげた連結を取り除くことができます。

array_3 = [x-y for x,y in zip(array_1,cycle(array_2))]
于 2013-02-18T15:30:03.537 に答える