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
相关产品推荐
相关产品推荐

