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

