Python 负数第二大

Python 负数第二大,python,Python,我用它来寻找数组中的第二大值,它在正数的情况下运行良好,但在负数的情况下失败。 你能推荐这个解决方案,这样它也适用于负数吗 arr = [-3,3,-3,3]; k = max(arr) m= arr[0]; i=0; k = max(arr) while i <(len(arr)-1): if(m<arr[i+1] and arr[i+1] !=k ): m= arr[i+1] i+=1 print m 下面是一个On解决方案,它查找并返回数字数组

我用它来寻找数组中的第二大值,它在正数的情况下运行良好,但在负数的情况下失败。 你能推荐这个解决方案,这样它也适用于负数吗

arr = [-3,3,-3,3];
k = max(arr)
m= arr[0];
i=0;
k = max(arr)
while i <(len(arr)-1):
    if(m<arr[i+1] and arr[i+1] !=k ):
        m= arr[i+1]
    i+=1
print m
下面是一个On解决方案,它查找并返回数字数组中的第二大元素:

def second_largest(seq):
    largest = float("-inf")
    second_largest = float("-inf")

    for elt in seq:
        if elt > largest:
            second_largest = largest
            largest = elt
        elif elt > second_largest:
            second_largest = elt
    return second_largest

arr = [-3,3,-3,3]
print(second_largest(arr))

arr = [-3, -4, -5, -1]
print(second_largest(arr))
警告:
除非您的序列是非常大的1000个元素,否则排序和检索第二个元素可能会更快。

针对此类问题的定制工具是标准库中的heapq模块:

import heapq

scnd = heapq.nlargest(2, yourarray)[1]
这是打开的,比排序快得多,尽管你只会开始感觉到百万条左右的差异

注意:如果您想要第二个最大值,那么如果您的元素是可散列的,那么一个快速修复程序将转换为一个集合:

scnd = heapq.nlargest(2, set(yourarray))[1]
如果这不是一个选项:

frst = max(yourarray)
scnd = max(i for i in yourarray if i<first)

为什么不对数组进行排序,然后选择第二个或最后第二个条目?@tadman你是在建议一个On问题的On*logn解决方案。我不认为这里的问题是负数。如果你将它们全部向上移动以消除负面影响,我相信你会看到一个相同的结果。对于这个示例数据,它正在打印-3,这是第二大值,而不是第二大列表元素。@Tomkarze在普通长度数组上,运行时间实际上是相同的。除非您有可测量的性能问题,否则简单的工作解决方案通常是最好的。过早优化会以不必要的复杂性扼杀代码库。@tadman您假设样本数据的大小表明了典型问题的大小。你是基于什么假设的?事实上,倒数第二个元素是不同的。它需要向后扫描第二个不同的值。例如,如果排序列表以…,8,12,12]结尾,则所需的值是8,而不是12。是的,我同意。我看到了你早些时候的评论。OP没有具体说明,是吗?最终OP在评论中做了。您的解决方案符合OP的澄清意图,但完整的排序解决方案需要扫描第二个不同的值。