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

如何不使用列表长度L和条件语句生成指定重叠滑动窗口?

解决方法:无需原列表长度或条件语句生成重叠子列表

这是个很巧妙的问题!我们可以利用Python切片的特性和逻辑运算符的短路行为,轻松实现需求——既不用依赖原列表的长度L,也不需要写显式的条件判断语句。

直接可用的代码实现

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
N = 4

# 核心写法
result = [li[i : (i - N + 1) or None] for i in range(N)]

print(result)

运行后输出完全符合预期:

[[1, 2, 3, 4, 5, 6, 7], [2, 3, 4, 5, 6, 7, 8], [3, 4, 5, 6, 7, 8, 9], [4, 5, 6, 7, 8, 9, 10]]

原理解释

这个写法的关键在于利用Python的两个特性:

  1. 切片的负索引与None的作用:当切片的结束位置是负数时,会从列表末尾往前数对应位置截断;当结束位置是None时,等价于取到列表的最后一个元素。
  2. 逻辑运算符的短路行为:
    • 对于前N-1个i值(比如例子中的i=0、1、2),i - N + 1会得到负数(如-3、-2、-1),负数在布尔判断中属于真值,所以(i - N +1) or None会直接返回这个负数,对应切片就能得到正确的子列表。
    • 当i=N-1时(例子中i=3),i - N +1等于0,0是布尔假值,所以0 or None会返回None,此时切片li[i:None]就等价于li[i:],正好取到列表末尾的完整子列表。

另一种等价写法(更显式的slice对象)

如果你觉得直接写切片语法不够直观,也可以用slice对象来实现,本质逻辑完全相同:

result = [li[slice(i, (i - N + 1) or None)] for i in range(N)]

内容的提问来源于stack exchange,提问作者gboffi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:40