Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 找到第二高的元素_Python - Fatal编程技术网

Python 找到第二高的元素

Python 找到第二高的元素,python,Python,在给定数组中,如何查找第二、第三、第四或第五个值 另外,如果我们在python中使用max()函数,那么复杂度的顺序是什么,即与此函数相关的max() 那么: sorted(li)[::-1][n] 如果性能是一个问题(例如:您打算经常这样称呼它),那么您应该始终对列表进行排序和重复数据消除,并且只保留第一个、第二个或第n个元素(即o(1)) 使用该模块进行此操作-它比“标准”排序快 insort允许您插入元素,bisect将允许您查找是否应该插入元素(以避免重复) 如果不是,我建议简单一

在给定数组中,如何查找第二、第三、第四或第五个值


  • 另外,如果我们在python中使用
    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]