2on*_*one 3 python arrays cycle
我如何在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)]
Run Code Online (Sandbox Code Playgroud)
元素的数量array_2总是小于元素的数量array_1.
array_1并array_2拥有任意数量的元素.
[num of elements in array_1]mod [number of elements in array_2]= 0
Mar*_*ers 10
from itertools import izip, cycle
array_3 = [a - b for a, b in izip(array_1, cycle(array_2))]
Run Code Online (Sandbox Code Playgroud)
这将适应array_2的任意大小.
这里itertools.izip()将两个列表中的元素组合成对,并且itertools.cycle()实用程序将反复使用第二个列表来提供配对的内容.
如果您不需要列表作为输出,只需要迭代结果,您也可以使用itertools.imap()它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
Run Code Online (Sandbox Code Playgroud)
对于大型输入列表,这可以节省您必须将中间结果存储在另一个列表中.
Itertools有大量工具可以解决您的问题
了解你的问题
所以这是实施
>>> 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]
Run Code Online (Sandbox Code Playgroud)
你可以使用operator.sub同map:
array_3 = map(operator.sub,array_1,array_2+array_2)
Run Code Online (Sandbox Code Playgroud)
或者,你可以这样做zip:
array_3 = [x-y for x,y in zip(array_1,array2+array2)]
Run Code Online (Sandbox Code Playgroud)
你可以使用itertools.cycle来摆脱array2的愚蠢连接
array_3 = [x-y for x,y in zip(array_1,cycle(array_2))]
Run Code Online (Sandbox Code Playgroud)