如何从列表中找出重复与非重复数字?求简洁伪代码方案
从列表中分离重复与非重复数字的优雅实现
问题分析
你需要从输入列表中找出仅出现一次的非重复数字和出现多次的重复数字,并按指定格式输出。你原来的代码存在逻辑错误和效率问题,结合集合/字典的频率统计是更优雅的解决方案。
简洁伪代码
1. 创建一个空的频率字典,用于存储每个数字的出现次数 2. 遍历输入列表中的每个数字: a. 如果数字已在字典中,将对应次数加1 b. 如果数字不在字典中,将其加入字典并设置次数为1 3. 创建两个空列表:non_duplicates(存非重复数字)、duplicates(存重复数字) 4. 遍历频率字典的每个键值对: a. 若次数为1,将数字加入non_duplicates b. 若次数>1,将数字加入duplicates 5. 按格式输出两个列表:先输出Non-duplicates及其内容,再输出Duplicates及其内容
Python 实现(两种方案)
方案1:使用collections.Counter(简洁高效)
# 读取输入(按示例每行一个数字,可处理到输入结束) input_list = [] while True: try: num = int(input()) input_list.append(num) except EOFError: break # 统计数字出现频率 from collections import Counter num_counts = Counter(input_list) # 分离非重复和重复数字 non_duplicates = [num for num, cnt in num_counts.items() if cnt == 1] duplicates = [num for num, cnt in num_counts.items() if cnt > 1] # 按要求输出 print("Non-duplicates:") for num in non_duplicates: print(num) print("Duplicates:") for num in duplicates: print(num)
方案2:手动统计(适合新手理解底层逻辑)
# 示例输入列表 input_list = [56, 75, 1, 46, 100, 97, 75, 46, 46] num_counts = {} # 手动统计频率 for num in input_list: if num in num_counts: num_counts[num] += 1 else: num_counts[num] = 1 # 分类数字 non_duplicates = [] duplicates = [] for num, count in num_counts.items(): if count == 1: non_duplicates.append(num) else: duplicates.append(num) # 输出结果 print("Non-duplicates:") for num in non_duplicates: print(num) print("Duplicates:") for num in duplicates: print(num)
原代码的问题说明
- 逻辑错误:你把重复和非重复的判断搞反了——第一次出现的数字被加入
dupes,后续重复出现的被加入unique,这和需求完全相反。 - 效率低下:使用列表的
x in dupes操作是O(n)复杂度,遍历整个列表时总时间复杂度为O(n²),数据量大时会很慢。
集合的作用说明
集合的in操作是O(1)的高效判断,但单纯用集合只能知道数字是否出现过,无法统计出现次数。结合字典(或Counter)可以同时记录元素和其出现频率,完美匹配你的需求——既利用了集合的高效查找特性,又能实现频率统计。
内容的提问来源于stack exchange,提问作者user17854673
相关产品推荐
相关产品推荐

