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

如何在Python中优雅拆分非连续整数数组为连续子数组

拆分Python数组为连续元素子数组的优雅实现

针对你需要将数组拆分为内部元素连续的子数组的需求,这里提供两种比手动写for循环更优雅的实现方式:

方法一:使用标准库itertools.groupby

利用groupby按自定义规则分组的特性,我们可以通过元素与索引的差值识别连续元素组——连续递增的元素,其索引-元素的值是固定的(反过来元素-索引也适用,逻辑一致)。

示例代码:

from itertools import groupby

arr = [1,2,3,7,8,9,10,11,14]
result = []
# 用enumerate获取索引和元素,按索引与元素的差值分组
for key, group in groupby(enumerate(arr), lambda x: x[0] - x[1]):
    # 从分组中提取元素组成子数组
    result.append([num for idx, num in group])

print(result)  # 输出: [[1, 2, 3], [7, 8, 9, 10, 11], [14]]

方法二:使用numpy处理大型数组

如果你的数组包含数百个元素(甚至更大),numpy的向量化操作会比纯Python循环效率更高。核心思路是找到相邻元素差值不为1的位置,以此作为拆分点。

示例代码:

import numpy as np

arr = np.array([1,2,3,7,8,9,10,11,14])
# 计算相邻元素的差值,找到差值≠1的位置,加1得到拆分索引
split_positions = np.where(np.diff(arr) != 1)[0] + 1
# 按拆分索引切割数组,再转换为Python列表格式
result = [subarray.tolist() for subarray in np.split(arr, split_positions)]

print(result)  # 输出: [[1, 2, 3], [7, 8, 9, 10, 11], [14]]

两种方法对比:

  • itertools.groupby属于Python标准库,无需额外安装,代码简洁,适合中小规模数组;
  • numpy的方式在处理超大型数组时性能优势明显,适合数据量较大的场景。

内容的提问来源于stack exchange,提问作者Sophia Jayasara Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:32:14