如何不使用列表长度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的两个特性:
- 切片的负索引与None的作用:当切片的结束位置是负数时,会从列表末尾往前数对应位置截断;当结束位置是
None时,等价于取到列表的最后一个元素。 - 逻辑运算符的短路行为:
- 对于前
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
相关产品推荐
相关产品推荐

