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

