如何在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]
mod [number of elements in array_2]
= 0
答案 0 :(得分: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()
utility会反复使用第二个列表来提供配对内容。
如果您不需要列表作为输出,只需要迭代结果,您也可以使用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
对于大型输入列表,这可以节省您必须将中间结果存储在另一个列表中。
答案 1 :(得分:6)
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]
答案 2 :(得分: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))]