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

如何在Python中将布尔列表转换为含True起始索引与连续数量的列表?

解决Python列表连续True序列的索引与长度统计问题

方法一:基础遍历实现

这种方式逻辑直白,适合新手理解:

def find_true_ranges(bool_list):
    result = []
    start_idx = None
    count = 0
    for idx, val in enumerate(bool_list):
        if val is True:
            # 首次遇到True,记录起始索引
            if start_idx is None:
                start_idx = idx
            count += 1
        else:
            # 遇到False,且之前有正在统计的True序列,存入结果并重置状态
            if start_idx is not None:
                result.append([start_idx, count])
                start_idx = None
                count = 0
    # 处理列表末尾可能遗留的True序列
    if start_idx is not None:
        result.append([start_idx, count])
    return result

# 测试示例
input_list = [False, False, True, True, True, False, True, True, False]
print(find_true_ranges(input_list))  # 输出: [[2, 3], [6, 2]]

方法二:用itertools.groupby简化代码

如果熟悉标准库,可以借助itertools.groupby更简洁地实现:

from itertools import groupby

def find_true_ranges(bool_list):
    result = []
    current_idx = 0
    # groupby会自动把连续相同的元素分组
    for key, group in groupby(bool_list):
        group_length = len(list(group))
        if key is True:
            result.append([current_idx, group_length])
        # 更新下一个分组的起始索引
        current_idx += group_length
    return result

# 测试示例
input_list = [False, False, True, True, True, False, True, True, False]
print(find_true_ranges(input_list))  # 输出: [[2, 3], [6, 2]]

核心逻辑说明

两种方法的本质都是跟踪连续True序列的起始位置和长度:

  • 方法一通过手动维护起始索引和计数器,遍历每个元素时判断状态切换
  • 方法二利用groupby自动分组连续相同元素,通过维护当前索引来计算每个分组的起始位置

内容的提问来源于stack exchange,提问作者sharwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:25:04