按特殊规则移除重复元素的Python实现问题求助
问题:特殊规则去重的代码错误排查
需求概述
需实现特殊规则的列表去重:
- 仅保留重复元素序列中的中间元素
- 重复个数为奇数时,保留正中间元素
- 重复个数为偶数时,保留中间偏右的元素
参考示例
[1,2,1,3,1] → [2,1,3](3个1,保留中间的1)[1,2,1,3,1,1] → [2,3,1](4个1,保留第3个1)[2,1,2,3,1] → [2,3,1][3,2,1] → [3,2,1][1,2,3,3,2,1] → [3,2,1][3,2,1,1,2,3,2,1,3,2] → [1,3,2]
问题代码
用户编写的Python实现:
def remove_duplicates(numbers): # Step 1: Initialize dictionary to track count and index count_dict = {} # Step 2: Count occurrences and store index for index, num in enumerate(numbers): if num in count_dict: count_dict[num].append(index) else: count_dict[num] = [index] # Step 3: Initialize list for final unique elements unique_elements = [] # Step 4: Determine unique elements based on the rule for num, indices in count_dict.items(): count = len(indices) if count == 1: unique_elements.append(num) else: middle_index = indices[count // 2 + count % 2 - 1] unique_elements.append(numbers[middle_index]) # Step 5: Return the list of unique elements return unique_elements
异常情况
输入[3,2,1,1,2,3,2,1,3,2]时,预期输出为[1,3,2],但实际返回[3,2,1]。
问题分析与修复
核心问题点
- 结果顺序错误:原代码直接按字典的插入顺序(元素首次出现顺序)收集结果,但需求要求最终列表的顺序由选中元素在原列表中的位置从小到大排序决定,而非元素首次出现的顺序。
- 中间索引计算错误:原公式
count//2 + count%2 -1不符合规则:- 偶数个重复元素时,比如count=4,需求保留中间偏右的第3个元素(索引2),但原公式计算得
2+0-1=1,取第2个元素,不符合要求。 - 正确的索引计算应为
count//2:- 奇数count=3 →
3//2=1(正中间元素) - 偶数count=4 →
4//2=2(中间偏右元素)
- 奇数count=3 →
- 偶数个重复元素时,比如count=4,需求保留中间偏右的第3个元素(索引2),但原公式计算得
修复后的代码
def remove_duplicates(numbers): count_dict = {} # 统计每个元素的出现索引 for index, num in enumerate(numbers): count_dict[num] = count_dict.get(num, []) + [index] # 收集每个元素的选中位置和对应值 selected_items = [] for num, indices in count_dict.items(): count = len(indices) # 计算符合规则的中间索引 middle_pos_idx = count // 2 selected_pos = indices[middle_pos_idx] selected_items.append( (selected_pos, numbers[selected_pos]) ) # 按选中位置的索引从小到大排序,再提取元素值 selected_items.sort() return [item[1] for item in selected_items]
验证测试
输入[3,2,1,1,2,3,2,1,3,2]时:
- 元素3的出现索引为
[0,5,8],选中位置为indices[1]=5,对应值3 - 元素2的出现索引为
[1,4,6,9],选中位置为indices[2]=6,对应值2 - 元素1的出现索引为
[2,3,7],选中位置为indices[1]=3,对应值1
按选中位置排序后得到[(3,1), (5,3), (6,2)],提取值即为预期的[1,3,2]。
内容的提问来源于stack exchange,提问作者Saikat Karmakar
相关产品推荐
相关产品推荐

