不使用for循环提取布尔列表中True值的起止范围 支持pandas Series
连续True区间提取方案
普通Python布尔列表单行实现
基于itertools.groupby实现,不需要额外写循环逻辑:
from itertools import groupby x = [False, True, True, True, True, False, True, True, False, True] result = [[start, start + len(list(group)) - 1] for start, group in groupby(range(len(x)), key=lambda idx: x[idx]) if x[start]]
逻辑说明:对索引序列按对应位置的布尔值分组,筛选出布尔值为True的分组,取分组首个索引作为区间起点,起点加分组长度减1作为区间终点。
pandas Series 适配方案
针对pandas布尔 Series 可以直接用内置的分组方法,数据量越大性能优势越明显:
import pandas as pd s = pd.Series([False, True, True, True, True, False, True, True, False, True]) result = s[s].groupby((~s).cumsum()).apply(lambda g: [g.index[0], g.index[-1]]).tolist()
逻辑说明:先过滤出所有值为True的行,再通过布尔值取反后的累计和做分组标识(连续的True会被分到同一组),每个分组取首尾索引即可得到区间。
两种方案运行后得到的结果都是[[1,4], [6,7], [9,9]],符合需求。
内容的提问来源于stack exchange,提问作者user3521099
相关产品推荐
相关产品推荐

