Python如何将一维列表按窗口大小5切分为滑动式列表的列表
固定步长滑动窗口切分列表实现
已知条件
- 原始一维列表定义:
mylist = [1, 2, 7, 11, 8, 55, 89, 1, 3, 8]
- 切分规则:窗口固定包含5个连续元素,每次窗口整体向后滑动1个位置,最终输出嵌套的列表结构
- 期望输出:
[[1, 2, 7, 11, 8], [2, 7, 11, 8, 55], [7, 11, 8, 55, 89],[11, 8, 55, 89, 1], [8, 55, 89, 1, 3], [55, 89, 1, 3, 8]]
原有代码问题
你之前编写的代码存在两个核心问题,无法得到目标结果:
- 初始索引列表
indices = [0,1,2]长度为3,和要求的窗口大小5不匹配 - Python的for循环在启动时就会固定遍历的迭代对象,循环内部重新给
indices赋值不会修改当前正在遍历的序列,逻辑不成立。
正确实现方案
方案1:直观循环实现
逻辑清晰,容易理解,适合新手:
window_size = 5 result = [] # 遍历所有合法的窗口起始索引 for start_idx in range(len(mylist) - window_size + 1): # 利用列表切片切取当前窗口的元素,追加到结果中 result.append(mylist[start_idx : start_idx + window_size])
方案2:列表推导式精简实现
代码更简洁,执行效率和循环写法一致:
window_size = 5 result = [mylist[i:i+window_size] for i in range(len(mylist) - window_size + 1)]
原理说明
Python列表切片为左闭右开规则,mylist[i:i+window_size]会刚好取到索引从i到i+window_size-1的共window_size个元素。
起始索引的取值上限为len(mylist) - window_size,保证切片不会超出列表边界:示例列表长度为10,窗口大小为5,因此起始索引可取0、1、2、3、4、5共6个值,刚好对应期望输出里的6个子列表。
注意:计算range的上界时必须加1,因为range本身是左闭右开区间,不加1会丢失最后一个合法窗口。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

