在Python中切片数组时使用多个值进行步进

Pau*_*l W 26 python arrays list

我试图在逐步遍历数组的每个n元素时获取m值.例如,对于m = 2和n = 5,并给出

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

我想要检索

b = [1, 2, 6, 7]
Run Code Online (Sandbox Code Playgroud)

有没有办法使用切片来做到这一点?我可以使用嵌套列表理解来做到这一点,但我想知道是否有办法只使用索引来做到这一点.作为参考,列表理解方式是:

 b = [k for j in [a[i:i+2] for i in range(0,len(a),5)] for k in j]
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 24

我同意wim,你不能只用切片来做到这一点.但是你可以只用一个列表理解来做到这一点:

>>> [x for i,x in enumerate(a) if i%n < m]
[1, 2, 6, 7]
Run Code Online (Sandbox Code Playgroud)


wim*_*wim 6

不,切片不可能.切片仅支持开始,停止和步骤 - 无法用大于1的"组"表示步进.


jpp*_*jpp 5

总之,不,你不能.但您可以使用itertools删除中间列表的需要:

from itertools import chain, islice

res = list(chain.from_iterable(islice(a, i, i+2) for i in range(0, len(a), 5)))

print(res)

[1, 2, 6, 7]
Run Code Online (Sandbox Code Playgroud)

借用@Kevin的逻辑,如果你想要一个矢量化的解决方案来避免for循环,你可以使用第三方库numpy:

import numpy as np

m, n = 2, 5
a = np.array(a)  # convert to numpy array
res = a[np.where(np.arange(a.shape[0]) % n < m)]
Run Code Online (Sandbox Code Playgroud)