如何让more_itertools.windowed生成包含末尾补全的第三组滑动窗口?
解决more_itertools.windowed无法生成最后一个填充窗口的问题
这个问题的核心是more_itertools.windowed在使用step参数时,默认的停止逻辑不会生成以序列最后一个元素为起始的窗口(即使需要用fillvalue填充剩余位置)。在你的例子中,起始位置4虽然是序列的有效索引,但windowed没有生成对应的窗口。
下面提供两种可行的解决方案:
方案1:扩展原序列后使用windowed
我们可以先给原序列补充足够的fillvalue,确保最后一个需要的窗口能被windowed捕获。补充的数量为n-1(因为最坏情况下,最后一个窗口只包含序列的最后一个元素,需要填充n-1个值):
from more_itertools import windowed seq = [0, 1, 2, 3, 4] n = 4 step = 2 fillvalue = 0 # 扩展序列,添加足够的填充值 extended_seq = seq + [fillvalue] * (n - 1) result = list(windowed(extended_seq, n, step=step)) print(result) # 输出: [(0, 1, 2, 3), (2, 3, 4, 0), (4, 0, 0, 0)]
方案2:自定义生成器函数
如果你不想依赖more_itertools的默认逻辑,可以自己实现一个生成器,完全按照你的需求生成窗口:
def custom_windowed(seq, window_size, fillvalue=0, step=1): seq_length = len(seq) start = 0 while start < seq_length: window = [] for i in range(window_size): current_idx = start + i window.append(seq[current_idx] if current_idx < seq_length else fillvalue) yield tuple(window) start += step # 测试 seq = [0, 1, 2, 3, 4] result = list(custom_windowed(seq, 4, 0, 2)) print(result) # 输出: [(0, 1, 2, 3), (2, 3, 4, 0), (4, 0, 0, 0)]
这个生成器会遍历所有有效的起始位置(从0开始,每次加step,直到起始位置超出序列长度),对每个位置生成窗口,不足的部分用fillvalue填充。
内容的提问来源于stack exchange,提问作者hyper
相关产品推荐
相关产品推荐

