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

Python中如何按间隔n步取每组m个数组元素?

如何用索引切片实现间隔取组元素

当然可以只用索引切片来完成这个需求!核心思路是按间隔n确定每个分组的起始位置,然后对每个起始位置取长度为m的切片,最后把所有切片合并起来,和你用嵌套列表推导式的逻辑本质是一样的,只是换了一种更直观的写法。

先看你的例子:
给定数组:

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

要求每间隔5个元素(n=5)取2个元素(m=2),得到结果b = [1, 2, 6, 7]

方法1:循环合并切片

最容易理解的写法是用循环遍历每个起始索引,把对应的切片追加到结果列表里:

m = 2
n = 5
b = []
for i in range(0, len(a), n):
    b += a[i:i+m]

运行这段代码后,b就会是你想要的[1,2,6,7]。

方法2:一行式切片合并

如果想追求简洁,可以用生成器表达式结合sum()来合并所有切片:

m = 2
n = 5
b = sum((a[i:i+m] for i in range(0, len(a), n)), [])

这里的(a[i:i+m] for i in range(0, len(a), n))是一个生成器,会依次产出每个长度为m的子列表;sum()函数的第二个参数[]指定了初始值为一个空列表,这样sum就会把所有子列表逐个合并成一个大列表,而不是做数值求和。

边界情况说明

如果数组长度不是n的整数倍,或者最后一组的元素不足m个,这个逻辑也能正常工作:
比如a = [1,2,3,4,5,6],n=5,m=2,结果会是[1,2,6];如果a = [1,2,3,4,5,6,7,8],n=5,m=3,结果就是[1,2,3,6,7,8],完全符合预期。

对比你提供的嵌套列表推导式:

b = [k for j in [a[i:i+2] for i in range(0,len(a),5)] for k in j]

两种写法的核心逻辑完全一致——都是先按间隔n拆分出起始点,再每个起始点取m个元素,最后扁平化所有子元素。切片的写法可能更直观一些,尤其是对刚接触列表推导式的人来说。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:04:39