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_1并且array_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()实用程序将一遍又一遍地重用第二个列表以提供配对的东西。

如果您不需要列表作为输出,只需要遍历结果,您也可以使用itertools.imap()and operator.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. 一个数组比另一个短
  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 回答