列表上的环绕式运行窗口

时间:2019-02-19 22:02:54

标签: python list

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

例如,给定一个列表:

l = [1, 2, 3, 4, 5, 6]

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

[1, 2, 3], [4, 5, 6]
[2, 3, 4], [5, 6, 1]
[3, 4, 5], [6, 1, 2]

或者将大小为n = 2的相同列表拆分为以下内容:

[1, 2], [3, 4], [5, 6]
[2, 3], [4, 5], [6, 1]

该列表可能无法平均分为n个子列表(例如,如果原始列表的长度为7且n = 3-或7或1以外的任何值)。舍入后的值len(l) / n可用于确定分割大小,就像通常情况一样。

This post是相关的,尽管它并没有像我所需要的那样环绕。我已经尝试过但没有做任何有用的事情。任何建议都将受到欢迎!

1 个答案:

答案 0 :(得分:4)

您可以在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))

使list(rolling_chunks(l, 3))返回:

[[[1, 2, 3], [4, 5, 6]], [[2, 3, 4], [5, 6, 1]], [[3, 4, 5], [6, 1, 2]]]

list(rolling_chunks(l, 2))返回:

[[[1, 2], [3, 4], [5, 6]], [[2, 3], [4, 5], [6, 1]]]