如何统计布尔列表中被False分隔的连续True分组长度并返回列表
布尔列表连续True分组计数方案
以下方案时间复杂度均为O(n),适配不同规模的列表需求:
方案1:基于itertools.groupby实现
你之前用groupby没得到预期结果,大概率是没有对分组的键做过滤,只需要筛选键为True的分组统计长度即可:
from itertools import groupby bool_list = [False, True, True, True, False, False, True, True, True, True, True, False, True, True, True, True, True, True, True, False] result = [len(list(group)) for key, group in groupby(bool_list) if key] # 输出结果:[3, 5, 7]
方案2:原生Python遍历实现
无需导入任何依赖,性能稳定,适合所有场景:
bool_list = [False, True, True, True, False, False, True, True, True, True, True, False, True, True, True, True, True, True, True, False] count = 0 result = [] for val in bool_list: if val: count += 1 else: if count > 0: result.append(count) count = 0 # 兼容列表末尾为True的场景 if count > 0: result.append(count) # 输出结果:[3, 5, 7]
方案3:Numpy向量化实现(适合超大规模列表)
如果你的布尔列表长度在十万级以上,用numpy的向量化运算可以大幅提升处理速度:
import numpy as np bool_list = [False, True, True, True, False, False, True, True, True, True, True, False, True, True, True, True, True, True, True, False] arr = np.array(bool_list, dtype=bool) # 补首尾边界后计算差分,定位连续True的起止位置 diff_arr = np.diff(np.concatenate(([False], arr, [False]))) start_pos = np.where(diff_arr == 1)[0] end_pos = np.where(diff_arr == -1)[0] result = (end_pos - start_pos).tolist() # 输出结果:[3, 5, 7]
内容的提问来源于stack exchange,提问作者isabelle tate
相关产品推荐
相关产品推荐

