You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现数组去重:移除出现偶数次元素,奇数次保留一个?

解决数组元素筛选问题:保留奇数次元素且仅留一个

这问题其实挺典型的,核心就是先统计每个元素的出现频次,再根据频次奇偶性做筛选,同时保证奇数次的元素只保留一个(还要注意和原数组首次出现的顺序一致)。我用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及以下版本,字典不保证顺序,结果的元素顺序可能会乱,所以得根据自己的环境来选。

核心思路总结

不管用哪种方法,本质都是两步:

  1. 统计频次:搞清楚每个元素在数组里出现了多少次;
  2. 筛选元素:只保留出现奇数次的元素,且每个这样的元素只留一个(同时尽量保证和原数组的顺序一致)。

内容的提问来源于stack exchange,提问作者genesi5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:27:20