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

如何用列表推导式(含Lambda)实现数组值变化时递增的列表生成?

用列表推导式(含Lambda)实现值变化时递增的列表生成

当然可以!这里有几种符合你需求的实现方案,优先结合Lambda函数和高效的内置工具来完成:

方案1:结合itertools.accumulate与Lambda(推荐,O(n)效率)

这个方案利用itertools.accumulate来累积计算变化次数,配合Lambda函数判断是否需要递增,是效率最高的实现方式:

from itertools import accumulate

boxes = [1,1,1,1,4,4,4,4]
# 先生成触发递增的标记列表:第一个元素为0,后续元素在值变化时为1,否则为0
change_markers = [0] + [1 if boxes[i] != boxes[i-1] else 0 for i in range(1, len(boxes))]
# 用accumulate配合Lambda累积求和,得到最终的positions列表
positions = list(accumulate(change_markers, lambda acc, curr: acc + curr))

print(positions)  # 输出: [0, 0, 0, 0, 1, 1, 1, 1]

逻辑说明:

  1. 先创建change_markers列表:第一个元素固定为0(对应初始位置),后续每个元素标记当前位置是否和前一个元素值不同(不同则为1,相同则为0)。
  2. 用accumulate和Lambda函数对标记列表做累积求和,每遇到1就递增计数,遇到0则保持当前计数,最终生成符合要求的positions。

方案2:纯列表推导式实现(无需额外导入)

如果不想导入itertools,也可以用纯列表推导式完成,不过时间复杂度为O(n²),适合小列表场景:

boxes = [1,1,2,2,4,4]
positions = [
    sum(1 for i in range(1, idx+1) if boxes[i] != boxes[i-1]) 
    for idx in range(len(boxes))
]

print(positions)  # 输出: [0, 0, 1, 1, 2, 2]

逻辑说明:

对于每个索引idx,统计从第1个元素到当前元素之间,一共发生了多少次值变化,这个统计结果就是当前位置的递增计数。初始位置(idx=0)因为没有前序元素,所以求和结果为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:53