如何循环处理列表:首尾求和并删减元素直至得到两位数结果
问题解决代码及说明
需求回顾
针对字符串"jankometka",需要完成两个核心任务:
- 统计字母出现频次得到初始列表
[1, 2, 1, 2, 1, 1, 1, 1],然后首尾配对求和,依次得到[2, 3, 2, 3]、[5, 5] - 生成每次移除首尾元素后的列表序列:
[1, 2, 1, 2, 1, 1, 1, 1] [2, 1, 2, 1, 1, 1] [1, 2, 1, 1] [2, 1]
原代码问题分析
- 频次统计效率低下:用
x.count(c)循环统计,每个字符都要遍历整个字符串,不如直接累加计数高效 - 列表操作逻辑错误:
pop后直接将原列表添加到empty_list,但列表是引用类型,后续修改会覆盖之前的记录;同时循环条件和索引处理混乱,无法正确生成移除首尾的序列 - 未实现首尾配对求和的核心逻辑
正确实现代码
from collections import Counter # 1. 统计字母出现频次,保证顺序与字符串中字母首次出现顺序一致 x = "jankometka" freq_counter = Counter(x) my_list = [] seen_chars = set() for char in x: if char not in seen_chars: my_list.append(freq_counter[char]) seen_chars.add(char) print("初始频次列表:", my_list) # 任务1:首尾配对求和迭代 current_sum_list = my_list.copy() sum_results = [] while len(current_sum_list) > 1: new_sum_group = [] # 首尾配对:第i个元素与倒数第i+1个元素求和 for i in range(len(current_sum_list) // 2): new_sum_group.append(current_sum_list[i] + current_sum_list[-(i+1)]) sum_results.append(new_sum_group) current_sum_list = new_sum_group print("\n求和迭代结果:") for res in sum_results: print(res) # 任务2:生成每次移除首尾后的列表序列 current_remove_list = my_list.copy() remove_sequences = [current_remove_list.copy()] while len(current_remove_list) > 2: # 截取中间部分,等价于移除首尾元素 current_remove_list = current_remove_list[1:-1] remove_sequences.append(current_remove_list.copy()) print("\n移除首尾的列表序列:") for seq in remove_sequences: print(seq)
代码说明
- 频次统计:用
Counter高效统计频次,再按字符串中字母首次出现的顺序提取值,确保得到正确的初始列表[1,2,1,2,1,1,1,1] - 首尾配对求和:通过循环迭代,每次取当前列表的第
i个和倒数第i+1个元素求和生成新列表,直到列表长度≤1 - 移除首尾序列:每次通过切片
[1:-1]获取去掉首尾后的子列表,复制后存入序列列表,避免引用导致的内容覆盖
内容的提问来源于stack exchange,提问作者Ollie
相关产品推荐
相关产品推荐

