如何高效查找Python列表中连续1的起始与结束索引?
查找列表中连续1的起始与结束索引
给定列表labels=[0,0,0,1,1,1,0,0,1,1],需要定位所有连续1块的起始和结束索引,预期结果为[3,5]和[8,9]。你之前的方法只能获取整体首尾1的范围,无法拆分独立的连续块,以下是两种高效实现方案:
方案一:纯Python遍历实现
无需依赖第三方库,直接通过遍历跟踪连续状态:
labels = [0,0,0,1,1,1,0,0,1,1] result = [] start_idx = None for idx, val in enumerate(labels): # 遇到1且未记录起始位置时,标记起始索引 if val == 1 and start_idx is None: start_idx = idx # 遇到0且已记录起始位置时,结束当前连续块,存入结果 elif val == 0 and start_idx is not None: result.append([start_idx, idx - 1]) start_idx = None # 处理列表末尾以1结尾的情况 if start_idx is not None: result.append([start_idx, len(labels) - 1]) print(result) # 输出: [[3, 5], [8, 9]]
方案二:Numpy高效实现
利用Numpy的数组差分操作快速定位边界,适合处理大规模数据:
import numpy as np labels = np.array([0,0,0,1,1,1,0,0,1,1]) # 在数组首尾补0,确保边界的差分能被捕获 extended = np.concatenate(([0], labels, [0])) # 计算差分,找到值变化的位置 diff = np.diff(extended) # 差分等于1的位置是连续1的起始索引 starts = np.where(diff == 1)[0] # 差分等于-1的位置是连续1结束的下一个索引,减1得到实际结束索引 ends = np.where(diff == -1)[0] - 1 # 组合起始和结束索引为结果列表 result = np.column_stack((starts, ends)).tolist() print(result) # 输出: [[3, 5], [8, 9]]
内容的提问来源于stack exchange,提问作者Talha Anwar
相关产品推荐
相关产品推荐

