在每一步从列表中切出大小为N的窗口

3 python list

如果我要分割下面的列表,比如说5步,我可以很容易地做到:

l = list(range(20))
l[::5]
Run Code Online (Sandbox Code Playgroud)

赠送:

[0, 5, 10, 15]
Run Code Online (Sandbox Code Playgroud)

但是,最简单的方法是在每个步骤中选择3个中心窗口(或者可用的多个项目)?所以:

[0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试这样的事情:

[[l[i-1],l[i],l[i+1]] for i in l[::5][1:]]
Run Code Online (Sandbox Code Playgroud)

哪个甚至没有返回扁平列表.

cs9*_*s95 5

在列表理解中使用列表切片:

[y for i in range(0, len(l), 5) for y in l[max(i-1, 0):i+2]]
# [0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]
Run Code Online (Sandbox Code Playgroud)

概括,我们有

window = 3 // 2
[y for i in range(0, len(l), 5) for y in l[max(i-window, 0):i+window+1]]
# [0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]
Run Code Online (Sandbox Code Playgroud)

使用itertools islice和的另一种选择chain:

from itertools import islice, chain

list(chain.from_iterable(
    islice(l, max(i-1, 0), i+2) for i in range(0, len(l), 5)))
# [0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]
Run Code Online (Sandbox Code Playgroud)