Skip to main content
 首页 » 编程设计

python之列表中的第 n 个重复元素

2025年05月04日15telwanggs

我对以下解决方案的更多 pythonic 和高性能方法感兴趣。

def nthFrequent(arr,n): 
 
    d = dict((x, arr.count(x)) for x in set(arr)) 
 
    value = sorted(d.values(), reverse=True) 
    # Pick nth repeated element 
    nthrepeat = value[n-1] 
 
    for (key, val) in d.iteritems(): 
        if val == nthrepeat: 
            return key 
 
 
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 在 9 之后重复了 3 次,即 4 次。

我正在寻找使用 lambda 的更优雅的方式,我尝试了以下方法但未获得所需的结果。

max(((item, a.count(item)) for item in set(a)), key=lambda k: k[1])[0]

上面的将获得最大重复值,即。 9.

如何获得第二个或第n个?

请您参考如下方法:

这对于 collections.Counter 来说非常简单。但是,请注意,如果 n 值更改为 3,此解决方案将仅返回 3 或 4 之一,因为在这种情况下会出现平局。

import collections 
 
def nthFrequent(arr,n): 
    return sorted([(v, k) for k, v in collections.Counter(arr).items()], reverse=True)[n-1][1] 
 
a = [1,2,3,4,5,6,7,92,3,2,35,9,2,43,4,9,9,9] 
 
print nthFrequent(a,2) 

还值得注意:元组列表按元组的 0 索引元素排序。因此,您可以将元组与 (count, value) 一起使用,然后只返回该值。排序中不需要 lambda。

如果你真的想在没有导入的情况下这样做,那么即使这样也会是一个更快的实现:

def nthFrequent3(arr, n): 
    d = {} 
    for v in arr: 
        if v not in d: 
            d[v] = 0 
        d[v] += 1 
 
    return sorted([(v, k) for k, v in d.items()], reverse=True)[n-1][1] 

如果您将来决定使用导入,那么也请看看 itertools。它也有一些方便的工具

def nthFrequent2(arr, n): 
    for i, (value, _) in enumerate(itertools.groupby(sorted(arr))): 
        if i == n - 1: 
            return value