Python 找到第二高的元素
在给定数组中,如何查找第二、第三、第四或第五个值Python 找到第二高的元素,python,Python,在给定数组中,如何查找第二、第三、第四或第五个值 另外,如果我们在python中使用max()函数,那么复杂度的顺序是什么,即与此函数相关的max() 那么: sorted(li)[::-1][n] 如果性能是一个问题(例如:您打算经常这样称呼它),那么您应该始终对列表进行排序和重复数据消除,并且只保留第一个、第二个或第n个元素(即o(1)) 使用该模块进行此操作-它比“标准”排序快 insort允许您插入元素,bisect将允许您查找是否应该插入元素(以避免重复) 如果不是,我建议简单一
max()
函数,那么复杂度的顺序是什么,即与此函数相关的max()
sorted(li)[::-1][n]
如果性能是一个问题(例如:您打算经常这样称呼它),那么您应该始终对列表进行排序和重复数据消除,并且只保留第一个、第二个或第n个元素(即
o(1)
)
使用该模块进行此操作-它比“标准”排序快
insort
允许您插入元素,bisect
将允许您查找是否应该插入元素(以避免重复)
如果不是,我建议简单一点:
def nth_largest(li, n):.
return sorted(set(li))[-(n+1)]
如果反向索引在您看来很难看,您可以执行以下操作:
def nth_largest(li, n):
return sorted(set(li), reverse=True)[n]
我会选择:
import heapq
res = heapq.nlargest(2, some_sequence)
print res[1] # to get 2nd largest
这比将整个列表排序,然后取第一个n
多个元素更有效。有关更多信息,请参阅。您可以使用排序(集合(元素))
:
作为一项功能:
def nth_largest(li, n):
return sorted(set(li))[-n]
测试:
注意,这里您只需要对重复进行一次排序和删除,如果您担心性能,您可以缓存
sorted(set(li))
至于哪个方法的时间复杂度最低,这在很大程度上取决于您计划进行的查询类型
如果您计划对高索引进行查询(例如,在一个包含38个元素的列表中,第36大元素),那么您的函数nth_最大(li,n)
将具有接近O(n^2)的时间复杂度,因为它必须多次执行max,即O(n)。除了使用max()
而不是min()
之外,它与选择排序算法类似
另一方面,如果您只进行低索引查询,那么您的函数可以是高效的,因为它将只应用O(n)max
函数几次,并且时间复杂度将接近O(n)。然而,在线性时间O(n)内构建最大堆是可能的,您最好使用它。在您经历了构建堆的麻烦之后,堆上的所有max()
操作都将是O(1),这对您来说可能是一个更好的长期解决方案
我认为最具可扩展性的方法(就能够查询任意n个最大元素而言)是使用内置的
sort
函数对时间复杂度为O(n log n)的列表进行排序,然后从排序后的列表中进行O(1)次查询。当然,这不是最节省内存的方法,但就时间复杂度而言,它非常有效 如果您不介意使用numpy(将numpy导入为np
):
给你
partition(a,kth)
方法返回一个数组,其中k
th元素与排序数组中的元素相同,前面的所有元素都较小,后面的所有元素都较大。max()的复杂度顺序是什么?@Hulk您必须在列表中扫描两次max
。。。这会扫描它一次,并使用堆队列保留最大的两个元素,因为他指定只想计算唯一元素(即[1,2,2])如果返回1而不是2,您首先必须为此设置列表以获得预期的结果。但是导入也是一项代价高昂的操作,那么为什么不使用内置排序呢method@JuanCatalanJon的意思是,您必须扫描列表两次,才能使用max()获得第二大元素
.reverse
执行到位并且不返回任何值。让我再试一次:您的代码现在不起作用,因为li\u s.reverse()
提供None
,并且None[n]
没有意义。只需执行排序(li,reverse=True)[n]
在排序后避免有关列表反转的麻烦…严肃地说,“不要这么挑剔”?(a)在Jon为您重写之前,您的解决方案根本不起作用;(b)作为一名优秀的开发人员,关键在于挑剔。告诉我们您在哪里工作,这样我们就可以避免乘坐您为其编写控制系统的任何电梯。我自己重写了它。“不要挑剔”是一个笑话。不要太认真。如果您有清单[1,2,2]
,您希望第二大元素是什么?1
还是2
?我希望您的情况是1
>>> 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
>>>
np.partition(numbers, -i)[-i]