Python实现列表循环移动窗口输出 首列按i*8生成问题求解
问题说明
给定初始列表 [1, 2, 3, 4, 5, 6, 7],需要生成高度为5行的循环滑动窗口输出,规则如下:
- 窗口每次向下滑动1个元素,滑动到列表末尾后回到列表头部循环取值
- 每行第一列数值固定为窗口内行偏移量
i(取值范围0~4)乘以8,即i*8,因此每个窗口的第一列固定为0、8、16、24、32 - 目标输出示例:
0 1 8 2 16 3 24 4 32 5 0 2 8 3 16 4 24 5 32 6 0 3 8 4 16 5 24 6 32 7 0 1 8 2 16 3 24 4 32 5
原代码问题分析
原实现存在三个核心错误:
- 第一列数值计算逻辑错误:用全局索引取模5计算位置,导致窗口滑动后第一列没有从0开始重置,和需求要求的「窗口内行偏移从0开始」规则冲突
- 列表取值没有做循环取模处理,索引超出列表长度后无法正确回到头部取值
- 全局变量
lines的重置逻辑混乱,无法正确控制窗口滑动的起始位置,且循环次数不足,缺少最后一个回到头部的窗口输出
正确实现方案
方案1:基础列表实现
不需要全局变量,直接通过模运算处理循环索引,逻辑简单直接:
def generate_sliding_window(lst, window_h=5, col_step=8): lst_len = len(lst) # 按示例生成4个窗口,可根据需要调整窗口总数 win_start_list = [0, 1, 2, 0] for start in win_start_list: for offset in range(window_h): # 模运算实现列表循环取值 val = lst[(start + offset) % lst_len] print(f"{offset * col_step:<2d} {val}") # 窗口之间打印空行分隔 print() if __name__ == "__main__": ll = [1, 2, 3, 4, 5, 6, 7] generate_sliding_window(ll)
如果需要无限连续滑动,只需要把win_start_list替换为自增的起始索引,每次对lst_len取模即可。
方案2:用deque实现
可以使用collections.deque完成该需求,deque原生支持旋转操作,更贴合循环滑动的场景:
from collections import deque def generate_sliding_window_deque(lst, window_h=5, col_step=8): dq = deque(lst) # 按示例生成4个窗口 for win_idx in range(4): # 取当前队列前window_h个元素作为当前窗口内容 current_win = list(dq)[:window_h] for offset, val in enumerate(current_win): print(f"{offset * col_step:<2d} {val}") print() # 左旋转1位:最左侧元素移到队列末尾,实现窗口滑动1位 dq.rotate(-1) # 匹配示例第四个窗口重置到初始状态的逻辑,可根据实际需求删除 if win_idx == 2: dq = deque(lst) if __name__ == "__main__": ll = [1, 2, 3, 4, 5, 6, 7] generate_sliding_window_deque(ll)
如果不需要示例中第四个窗口重置到初始状态的特殊逻辑,删除代码中判断win_idx==2重置队列的部分即可,代码会自动按顺序循环生成所有滑动窗口。
内容的提问来源于stack exchange,提问作者emcek
相关产品推荐
相关产品推荐

