Python中如何从列表返回仅出现一次的元素?(Codewars问题场景)
嘿,这个问题我当初刷Codewars的「Find the odd int」时也踩过坑!刚好可以给你分享几个实用又简便的方法,完美解决这类找“唯一出现奇数次元素”的问题~
方法1:手动用字典计数(你思路的完整实现)
既然你已经用到了字典,那可以把这个思路补全:先遍历列表统计每个数字的出现次数,再筛选出次数为奇数的那个值。
x = [5, 5, 2, 5, 5, 3, 3, 4, 4] counts = {} for num in x: # 用get方法避免键不存在的报错,默认计数0 counts[num] = counts.get(num, 0) + 1 # 题目保证只有一个符合条件的数,直接取第一个结果 result = [num for num, cnt in counts.items() if cnt % 2 != 0][0] print(result) # 输出2
方法2:用collections.Counter(更简洁的标准库方案)
Python内置的Counter就是专门用来做元素计数的,用它能省掉手动写计数逻辑的步骤,代码更清爽:
from collections import Counter x = [5, 5, 2, 5, 5, 3, 3, 4, 4] # 用next直接取第一个符合条件的键(题目保证唯一) result = next(num for num, cnt in Counter(x).items() if cnt % 2 != 0) print(result)
方法3:异或运算(最巧妙的高效解法)
这是我后来发现的黑科技,利用异或的数学特性,能在O(1)的空间复杂度下解决问题:
- 任何数和自身异或结果为0:
a ^ a = 0 - 任何数和0异或结果为自身:
a ^ 0 = a - 异或满足交换律和结合律
把列表里所有数依次异或,最后剩下的就是那个出现奇数次的数:
x = [5, 5, 2, 5, 5, 3, 3, 4, 4] result = 0 for num in x: result ^= num print(result) # 输出2
顺便提一句,我当初第一次做这个题也误解了题意,以为只是找“仅出现一次”的数,后来才发现题目是找出现奇数次的数(比如某个数出现3次也符合要求),不过上面的方法都能覆盖这两种情况~
内容的提问来源于stack exchange,提问作者user2467011
相关产品推荐
相关产品推荐

