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

如何从递增重置型列表中提取各段最大值生成新列表?

问题解决思路与代码实现

首先明确需求:把原列表按「递增重置段」拆分,每个段从1开始,非递减到最大值后重置回1(或到列表末尾);对每个段保留最大值及必要的前置1,最终生成目标长度的列表。

实现步骤

  1. 拆分递增重置段:将原列表分成多个子段,每个子段以1开头,直到遇到「前一个元素>1且当前元素=1」时开启新段。
  2. 处理每个段:
    • 若段内最大值为1,直接保留全部元素;
    • 若最大值M>1,计算需要保留的前置1数量(最多保留段内1的个数 - (M-1)个,不足则取0),再拼接上从第一个非1元素到段尾的部分。

完整代码

mylist = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 
          1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3]

# 步骤1:拆分递增重置段
segments = []
current_segment = [mylist[0]]
for num in mylist[1:]:
    if num == 1 and current_segment[-1] > 1:
        segments.append(current_segment)
        current_segment = [num]
    else:
        current_segment.append(num)
segments.append(current_segment)

# 步骤2:处理每个段生成new_list
new_list = []
for seg in segments:
    max_val = max(seg)
    if max_val == 1:
        new_list.extend(seg)
        continue
    # 统计段内1的数量
    count_1 = sum(1 for x in seg if x == 1)
    # 计算需要保留的1的数量
    keep_1 = max(0, count_1 - (max_val - 1))
    # 找到第一个非1元素的位置
    first_non_1_idx = next(i for i, x in enumerate(seg) if x > 1)
    # 取最后keep_1个1,加上后面的非1部分
    kept_1s = seg[:first_non_1_idx][-keep_1:] if keep_1 > 0 else []
    new_list.extend(kept_1s + seg[first_non_1_idx:])

# 验证结果
print(new_list)
# 输出:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 3]
print(len(new_list))  # 输出:32

原代码问题分析

原代码只遍历到len(mylist)-1,直接漏掉了最后一个元素3;同时仅对比相邻元素,无法处理跨多个元素的递增链(比如[1,2,3]这种多步递增的情况),导致逻辑不完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:39:54