列表中的重复元素

时间:2018-04-22 04:55:13

标签: python list repeat

我对以下解决方案的更多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,因为两次在9之后重复3次,这是4次。

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

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

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

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

3 个答案:

答案 0 :(得分:4)

这与collections.Counter相当直接。但是,请注意,如果SELECT * FROM ( SELECT *, CASE WHEN direction_or = 'Northwest' THEN 'NW' WHEN direction_or = 'Southwest' THEN 'SW' -- all other possibilities here ELSE '' END as direction_or_abb FROM user.directions ) a JOIN stored.directions b ON a.direction_or_abb = b.direction_or 值更改为3,此解决方案将仅返回3或4中的一个,因为在这种情况下会有一个平局。

n

另外值得注意的是:元组的列表由元组的0索引元素排序。因此,您可以使用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) 的元组并返回该值。排序中不需要lambda。

如果你真的想在没有进口的情况下这样做,那么即使这样做也会更快:

(count, value)

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

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]

答案 1 :(得分:2)

如果您正在寻找单线,以下情况应该有效:

return sorted(((item, a.count(item)) for item in set(a)), key=lambda k: k[1], reverse=True)[n-1][0]

虽然上面使用了更多Python语言功能,但实际上我更喜欢原始代码的可读性。

作为旁注,在原始代码中,您应return key,因为您当前正在尝试打印不返回值的函数。

如果你关心领带,就像@sberry提到的那样,你可以这样做:

当计数相同时获取最小值:

return sorted(((item, a.count(item)) for item in set(a)), 
    key=lambda k: (k[1], k[0]), reverse=True)[n-1][0]

当计数相同时获取最大值:

return sorted(((item, a.count(item)) for item in set(a)), 
    key=lambda k: (k[1], -k[0]), reverse=True)[n-1][0]

答案 2 :(得分:2)

N 的长度为entrySet(),此行:

arr

按照 N 2 的顺序执行了许多步骤。首先,遍历d = dict((x, arr.count(x)) for x in set(arr)) 以找到其唯一元素(最坏的情况是每个元素都是唯一的)。其次,对于每个唯一元素,再次遍历整个列表以计算该元素出现的次数。您的单行解决方案也是 N 2 的顺序。

这是不必要的重复步骤。您只需要查看arr的每个元素一次。只需一步,您就可以:

  • 检查您是否已经看过这个元素

  • 增加此元素的计数器

像这样:

arr

在最坏的情况下,每个元素都是唯一的,由于排序,此代码按照 N * log(N)的顺序执行了许多步骤。 (传递counter = {} for x in arr: if x not in counter: counter[x] = 0 counter[x] += 1 pairs = sorted(counter.iteritems(), key=lambda pair: pair[1], reverse=True) key, count = pairs[n] return key 的顺序为 N ,因为Python中的arr查找的摊销顺序为1。)