如何实现数组去重:移除出现偶数次元素,奇数次保留一个?
解决数组元素筛选问题:保留奇数次元素且仅留一个
这问题其实挺典型的,核心就是先统计每个元素的出现频次,再根据频次奇偶性做筛选,同时保证奇数次的元素只保留一个(还要注意和原数组首次出现的顺序一致)。我用Python给你写几种实现思路:
方法一:手动统计频次 + 按原顺序筛选
这是最基础的实现方式,不用依赖任何库,新手也容易理解:
original = [1, 0, 0, 0, 5, 2, 4, 5, 2, 2] # 第一步:统计每个元素的出现次数 count_map = {} for num in original: # 用get方法避免键不存在的报错,默认值设为0 count_map[num] = count_map.get(num, 0) + 1 # 第二步:遍历原数组,筛选符合条件的元素 result = [] # 用集合记录已经添加过的元素,避免重复加入 added_elements = set() for num in original: # 只有出现奇数次且还没被加入结果的元素,才添加进去 if count_map[num] % 2 == 1 and num not in added_elements: result.append(num) added_elements.add(num) print(result) # 输出: [1, 0, 2, 4]
逻辑很清晰:先把每个元素的出现次数数清楚,再顺着原数组的顺序走,遇到符合要求的元素就加入结果,同时标记为已添加,确保只留一个。
方法二:用标准库简化统计步骤
如果想让代码更简洁,可以用Python内置的collections.defaultdict来替代普通字典,省去get方法的写法:
from collections import defaultdict original = [1, 0, 0, 0, 5, 2, 4, 5, 2, 2] count_map = defaultdict(int) for num in original: count_map[num] += 1 result = [] added_elements = set() for num in original: if count_map[num] % 2 == 1 and num not in added_elements: result.append(num) added_elements.add(num) print(result)
这个和方法一的核心逻辑完全一样,只是统计频次的步骤更顺手了。
方法三:利用Python3.7+的字典特性简化筛选
如果你用的是Python3.7及以上版本,那可以更偷懒——因为这个版本的字典会保留键的插入顺序,所以统计完频次后,直接遍历字典的键就行:
original = [1, 0, 0, 0, 5, 2, 4, 5, 2, 2] count_map = {} for num in original: count_map[num] = count_map.get(num, 0) + 1 # 直接筛选出频次为奇数的键,因为字典保留插入顺序,结果顺序和原数组首次出现一致 result = [num for num, count in count_map.items() if count % 2 == 1] print(result) # 输出: [1, 0, 2, 4]
这个写法最简洁,但要注意Python版本的限制——如果是3.6及以下版本,字典不保证顺序,结果的元素顺序可能会乱,所以得根据自己的环境来选。
核心思路总结
不管用哪种方法,本质都是两步:
- 统计频次:搞清楚每个元素在数组里出现了多少次;
- 筛选元素:只保留出现奇数次的元素,且每个这样的元素只留一个(同时尽量保证和原数组的顺序一致)。
内容的提问来源于stack exchange,提问作者genesi5
相关产品推荐
相关产品推荐

