如果我要分割下面的列表,比如说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)
哪个甚至没有返回扁平列表.
在列表理解中使用列表切片:
[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)