找到第二高的元素

时间:2013-08-31 15:31:03

标签: python

  1. 在给定数组中如何找到第2,第3,第4或第5个值?

  2. 此外,如果我们在python中使用max()函数,复杂的顺序是什么,即与此函数max()相关联?

  3. def nth_largest(li,n):   
        li.remove(max(li))
        print max(ele)  //will give me the second largest
        #how to make a general algorithm to find the 2nd,3rd,4th highest value
        #n is the element to be found  below the highest value
    

6 个答案:

答案 0 :(得分:15)

我去找:

import heapq
res = heapq.nlargest(2, some_sequence)
print res[1] # to get 2nd largest

这比排序整个列表更有效,然后采用第一个n个元素。有关详细信息,请参阅heapq documentation

答案 1 :(得分:4)

您可以使用sorted(set(element))

>>> a = (0, 11, 100, 11, 33, 33, 55)
>>>
>>> sorted(set(a))[-1] # highest
100
>>> sorted(set(a))[-2] # second highest
55
>>>

作为一个功能:

def nth_largest(li, n):
    return sorted(set(li))[-n]

试验:

>>> a = (0, 11, 100, 11, 33, 33, 55)
>>> def nth_largest(li, n):
...     return sorted(set(li))[-n]
...
>>>
>>> nth_largest(a, 1)
100
>>> nth_largest(a, 2)
55
>>>

注意,在这里您只需要对复制进行排序和删除一次,如果您担心性能可以缓存sorted(set(li))的结果。

答案 2 :(得分:2)

如果性能是一个问题(例如:你打算多次调用它),那么你应该绝对保持列表的排序和重复数据删除,只需要第一个,第二个或第n个元素(即{ {1}})。

使用bisect模块 - 它比“标准”o(1)更快。

sort允许您插入元素,insort将让您找到是否应该插入(以避免重复)。


如果不是,我建议更简单:

bisect

如果反向索引看起来很难看,你可以这样做:

def nth_largest(li, n):.
    return sorted(set(li))[-(n+1)]

答案 3 :(得分:2)

至于哪种方法的时间复杂度最低,这很大程度上取决于您计划制作哪种类型的查询。

如果您计划对高索引进行查询(例如,列表中包含38个元素的第36个最大元素),则函数nth_largest(li,n)将具有接近O(n ^ 2)时间复杂度,因为它将具有做多次,即O(n),几次。除了使用max()而不是min()之外,它与选择排序算法类似。

另一方面,如果您只进行低索引查询,那么您的函数可以高效,因为它只会应用O(n)max函数几次,时间复杂度接近于上)。但是,在线性时间O(n)中建立最大堆是可能的,你最好只使用它。在您完成构建堆的麻烦之后,堆上的所有max()操作都将为O(1),这对您来说可能是一个更好的长期解决方案。

我认为最可扩展的方式(就能够查询任何 n的第n个最大元素而言)是使用内置的时间复杂度O(n log n)对列表进行排序sort函数,然后从排序列表中进行O(1)查询。当然,这不是最节省内存的方法,但就时间复杂度而言,它非常有效。

答案 4 :(得分:0)

如果你不介意使用numpy(import numpy as np):

np.partition(numbers, -i)[-i]

给你the ith largest element of the list with a guaranteed worst-case O(n) running time

partition(a, kth)方法返回一个数组,其中k元素与排序数组中的元素相同,之前的所有元素都较小,后面的所有元素都较大。

答案 5 :(得分:-1)

怎么样:

sorted(li)[::-1][n]