Python如何更简洁实现列表连续1累计计数并生成新列表
连续1累计计数的简洁实现方案
首先明确需求:给定仅含0、1的列表,逐位统计连续1的累计长度,遇到0则重置计数,示例输入输出如下:
- 输入列表:
[0, 0, 0, 0, 1, 1, 0, 0, 1] - 输出列表:
[0, 0, 0, 0, 1, 2, 0, 0, 1]
你当前写的for循环加计数器的实现逻辑是完全正确的,如果要更紧凑的写法,可以参考下面两种常用方案:
方案1:标准库itertools.accumulate实现(无额外状态变量)
直接用Python标准库的累积计算函数,不需要手动维护计数器、也不需要手动append,核心逻辑仅需1行:
from itertools import accumulate lst = [0, 0, 0, 0, 1, 1, 0, 0, 1] new_lst = list(accumulate(lst, lambda pre, cur: pre + cur if cur else 0))
逻辑和你手写的循环完全一致:遍历过程中如果当前值是1,就把之前的累计计数加1;如果当前值是0,直接把累计值重置为0。这个写法没有额外的临时变量污染,属于函数式的实现风格。
方案2:海象运算符列表推导式(Python 3.8+,无依赖)
如果你的Python版本在3.8及以上,支持海象运算符:=,可以直接在列表推导里维护计数器状态,不需要导入任何库:
lst = [0, 0, 0, 0, 1, 1, 0, 0, 1] count = 0 new_lst = [count := count + 1 if val else 0 for val in lst]
这个写法比原生for循环少了手动append的步骤,结构更紧凑,执行效率和原生循环基本一致。
选型建议
- 你原本的for循环写法兼容性最好(支持所有Python版本)、可读性最高,生产环境用完全没问题
- 如果要写工具脚本追求代码紧凑,优先选
accumulate的方案,不需要额外初始化计数器变量 - 如果不想导入标准库,且运行环境Python版本足够,海象运算符的列表推导是最方便的选择
内容的提问来源于stack exchange,提问作者Babbara
相关产品推荐
相关产品推荐

