You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:16:02