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

如何高效查找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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:31:18