列表上环绕运行窗口

ong*_*enz 2 python list

我希望使用“滑动窗口”将列表拆分为相同大小的块,但我不想在末尾截断列表,而是想环绕,以便最终的块可以分布在列表的开头和结尾。

例如,给定一个列表:

l = [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我希望生成大小为 n=3 的块,如下所示:

[1, 2, 3], [4, 5, 6]
[2, 3, 4], [5, 6, 1]
[3, 4, 5], [6, 1, 2]
Run Code Online (Sandbox Code Playgroud)

或者,具有大小为 n=2 的块的同一列表应按如下方式拆分:

[1, 2], [3, 4], [5, 6]
[2, 3], [4, 5], [6, 1]
Run Code Online (Sandbox Code Playgroud)

该列表可能不会被均匀地划分为 n 个子列表(例如,如果原始列表的长度为 7 并且 n=3 - 或除 7 或 1 之外的任何值)。与通常情况一样,舍入值len(l) / n可用于确定分割大小。

这篇文章是相关的,尽管它没有按照我的需要进行环绕。我已经尝试过但没有成功任何有用的东西。任何建议将非常受欢迎!

blh*_*ing 5

您可以使用itertools.islice从以下生成的环绕迭代器itertools.cycle

from itertools import cycle, islice
def rolling_chunks(l, n):
    return ([list(islice(cycle(l), i + j, i + j + n)) for j in range(0, len(l), n)] for i in range(n))
Run Code Online (Sandbox Code Playgroud)

这样list(rolling_chunks(l, 3))返回:

[[[1, 2, 3], [4, 5, 6]], [[2, 3, 4], [5, 6, 1]], [[3, 4, 5], [6, 1, 2]]]
Run Code Online (Sandbox Code Playgroud)

返回list(rolling_chunks(l, 2))

[[[1, 2], [3, 4], [5, 6]], [[2, 3], [4, 5], [6, 1]]]
Run Code Online (Sandbox Code Playgroud)

  • 这是金子!非常感谢! (2认同)