寻求更Pythonic且高性能的列表第n高频元素求解方案(Lambda优化)
嘿,我来帮你把这个找第n高频元素的函数优化得更Pythonic还更高效!先聊聊原代码的小短板:arr.count(x)在遍历集合里的每个元素时,每次都要完整扫一遍整个列表,数据量大的时候效率会拉胯(时间复杂度是O(n²))。下面给你几个更优雅的实现,包括你想要的lambda写法~
方案1:用标准库collections.Counter(最简洁高效)
Counter是Python专门为计数场景设计的工具,只需要一次遍历就能统计完所有元素的频次,性能比原代码好太多。结合它的most_common方法,一行就能搞定:
from collections import Counter def nthFrequent(arr, n): # most_common(n)返回前n个高频元素的(元素, 频次)元组列表,取最后一个的元素部分 return Counter(arr).most_common(n)[-1][0]
测试一下你给的列表:
a = [1,2,3,4,5,6,7,92,3,2,35,9,2,43,4,9,9,9] print(nthFrequent(a, 2)) # 输出2,和预期一致
方案2:写成Lambda表达式(满足你的需求)
如果想把它压缩成lambda形式,直接套进去就行:
from collections import Counter nthFrequent = lambda arr, n: Counter(arr).most_common(n)[-1][0]
调用方式和之前完全一样,简洁到飞起~
额外补充:处理频次相同的情况
如果遇到多个元素频次相同的场景,原代码因为遍历的是无序的dict(Python3.7之前),返回结果可能不确定。如果想要按元素在原数组中首次出现的顺序来排序(频次相同的话,先出现的排前面),可以用lambda作为排序key:
from collections import Counter def nthFrequent(arr, n): count = Counter(arr) # 按频次降序,频次相同则按元素在原数组的首次出现位置升序 sorted_items = sorted(count.items(), key=lambda x: (-x[1], arr.index(x[0]))) return sorted_items[n-1][0]
这个写法比原代码更可控,结果也更稳定。
性能对比
原代码的时间复杂度是O(n*m)(n是列表长度,m是不同元素的数量),而用Counter的方案统计是O(n),排序是O(m log m),当列表很大时,性能提升非常明显。
内容的提问来源于stack exchange,提问作者paddu
相关产品推荐
相关产品推荐

