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

寻求更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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:13