如何从递增重置型列表中提取各段最大值生成新列表?
问题解决思路与代码实现
首先明确需求:把原列表按「递增重置段」拆分,每个段从1开始,非递减到最大值后重置回1(或到列表末尾);对每个段保留最大值及必要的前置1,最终生成目标长度的列表。
实现步骤
- 拆分递增重置段:将原列表分成多个子段,每个子段以1开头,直到遇到「前一个元素>1且当前元素=1」时开启新段。
- 处理每个段:
- 若段内最大值为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
相关产品推荐
相关产品推荐

