Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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_List_Max - Fatal编程技术网

Python 如何查找列表中的第二大数字?

Python 如何查找列表中的第二大数字?,python,list,max,Python,List,Max,所以我必须从列表中找出第二大数字。我是通过简单的循环来完成的 我的方法是将列表分成两部分,然后将最大的数字分成两部分,然后比较两个数字。我将从其中两个中选择较小的数字。我不能使用现成的函数或不同的方法 基本上,这是我的代码。但它不能正确运行 #!/usr/local/bin/python2.7 alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706] largest=alist[0] h=len(alist)/2 m=len(alist)-h pr

所以我必须从列表中找出第二大数字。我是通过简单的循环来完成的

我的方法是将列表分成两部分,然后将最大的数字分成两部分,然后比较两个数字。我将从其中两个中选择较小的数字。我不能使用现成的函数或不同的方法

基本上,这是我的代码。但它不能正确运行

#!/usr/local/bin/python2.7

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
largest=alist[0]
h=len(alist)/2 
m=len(alist)-h

print(alist)

for i in alist:
    if alist[h]>largest:
      largest=alist[h]
      i=i+1
print(largest)
O(n^2)算法:

In [79]: alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

In [80]: max(n for n in alist if n!=max(alist))
Out[80]: 100
In [81]: alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

In [82]: M = max(alist)

In [83]: max(n for n in alist if n!=M)
Out[83]: 100
O(n)算法:

In [79]: alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

In [80]: max(n for n in alist if n!=max(alist))
Out[80]: 100
In [81]: alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

In [82]: M = max(alist)

In [83]: max(n for n in alist if n!=M)
Out[83]: 100

在不泄露代码的情况下,我将为您提供解决此问题的方法

1.)拿着你的清单,从最小到最大排序。有一个python函数来处理这个问题

2.)将列表分为两部分

3.)比较两个部分,取数字最大的一半,重复#2

4.)当任何一半只包含两个数字时,从该列表中选取第一个数字

面临的挑战是,如果列表无法平均分割,您将不得不决定要做什么。显然,在现实世界中,您会对列表进行排序并返回最后一个值的第二个值,但如果您必须通过执行二进制拆分来执行此操作,我会这样做:)

O(n)解决方案

编辑:更改为使用负数。基本描述如下

首先,我将m设置为alist的前两个元素。当我遍历alist时,我将在m的末尾添加一个值,然后对三个元素进行排序,并丢弃最小的一个。这样可以确保m的末尾包含顶部两个最大的元素。

尝试以下操作:

alist=[10, 0,3,10,90,5,-2,4,18,45,707, 100,1,-266,706, 1]
largest = alist[0]
second_largest = alist[0]
for i in range(len(alist)):
    if alist[i] > second_largest:
        second_largest = alist[i]
    if alist[i] > largest:
        tmp = second_largest
        second_largest = largest
        largest = tmp      

print(largest, second_largest)
alist = [1, 7, 3, 2, 8, 5, 6, 4]

def find_2_largest(alist):
    sorted_list = mergesort(alist)
    return (sorted_list[-2], sorted_list[-1])    

def merge(left, right):
    result = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def mergesort(alist):
    if len(alist) < 2:
        return alist
    middle = len(alist) / 2
    left = mergesort(alist[:middle])
    right = mergesort(alist[middle:])
    return merge(left, right)

print find_2_largest(alist)

您不必对输入进行排序,此解决方案以O(n)形式运行。因为你的问题说你不能使用内置函数,你可以使用这个

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
largest, larger = alist[0], alist[0]

for num in alist:
    if num > largest:
        largest, larger = num, largest
    elif num > larger:
        larger = num
print larger
输出

100
跟踪最大数字和第二大数字(
larger
变量存储在代码中)。如果当前数字大于
最大值
,则当前数字变为
最大值
最大值
变大

最大,较大=num,最大

temp = largest
largest = num
larger = temp
编辑:根据OP在评论中的要求

def findLarge(myList):
    largest, larger = myList[0], myList[0]
    for num in myList:
        if num > largest:
            largest, larger = num, largest
        elif num > larger:
            larger = num
    return largest, larger

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

firstLargest, firstLarger  = findLarge(alist[:len(alist)//2])
secondLargest, secondLarger = findLarge(alist[len(alist)//2:])

print sorted((firstLarger, firstLargest, secondLarger, secondLargest))[-2]

如果你想要一种划分列表的方法,我能想到的最接近的方法是MergeSort,它可以将列表划分为2,但是它可以对列表进行排序。然后你可以选择最后两个元素

alist = [1, 7, 3, 2, 8, 5, 6, 4]

def find_2_largest(alist):
    sorted_list = mergesort(alist)
    return (sorted_list[-2], sorted_list[-1])    

def merge(left, right):
    result = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def mergesort(alist):
    if len(alist) < 2:
        return alist
    middle = len(alist) / 2
    left = mergesort(alist[:middle])
    right = mergesort(alist[middle:])
    return merge(left, right)

print find_2_largest(alist)
alist=[1,7,3,2,8,5,6,4]
def find_2_最大(列表):
排序列表=合并排序(列表)
返回(已排序的\u列表[-2],已排序的\u列表[-1])
def合并(左、右):
结果=[]
i、 j=0,0
而i如果离开[i],我很惊讶大多数答案(克里斯蒂安的答案除外)都没有试图回答OP使用分而治之方法找到解决方案的真正问题

这个问题几乎与这个问题相同,但它试图找到最小的,而不是最大的

这是:

def两分钟(arr):
n=长度(arr)
如果n==2:

如果arr[0]列表中的第二大编号

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
second_highest_number = sorted(list(set(alist)))[-2]
如果只需要列表中第二大的元素(在最高值可能出现两次的情况下),只需跳过set()和list()调用

alist=[-45,0,3,10,90,5,-2,4,18,45100,1,-266706]
最大值=0
第二大=0
对于大型in-alist:
如果第二大<大:
第二大=大
如果最大<大:
温度=第二大
第二大=最大
最大值=温度
打印“第一高:-%s”%s
打印“第二高:-%s”%第二高

这是我的程序,不管复杂程度如何

if __name__ == '__main__':
    alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
    alist1 = [ ]
    [alist1.append(x) for x in alist if x not in alist1]
    alist1.sort()
    print alist1[-2]
alist=[-45,0,3,10,90,5,-2,4,18,45100,1,-266706]
已排序的列表=已排序的(集合(列表))
已排序的\u list.pop()
打印(最大值(已排序列表))

如果两者都在列表的同一部分怎么办?以下是您问题的答案!如果最大的和第二大的数字在你的分界线的同一边呢<代码>[-10,-5,10,20]
例如?您的方法不会捕获
-5
而不是所需的
10
。考虑使用长度为2的列表(OR)来存储两个最高遇到的数字。可能的副本i喜欢答案,因为它提供提示而不是给出代码块。如果已经排序了列表,则可以只使用第二个最后一个元素。DTOP说他不能使用不同的方法。我甚至在我的问题中提到过,如果你一直读下去的话@justhalf@samrap:要求使用“分而治之”,而不是使用排序。当然,你可以使用分而治之的方法进行排序,就像合并排序一样,但在这里它是不必要的。@justhalf我想没有人理解我的问题。我想我需要更多的解释……在这里我被不同的方法弄糊涂了;(你能再解释一下吗?那我就可以+1这个了=D@ManuLakaster这是因为您根本不需要这样做。内置函数
排序
处理它。@Manulakster顺便说一句,您的逻辑有一个缺陷,您无法确保
second
first
数字是否都在列表的同一部分。您会遇到问题如果列表中的所有数字都是负数。此算法可以扩展为处理任何数字
m
,以返回第个最大元素
m
。但是,由于对大小为
O(m)的列表进行排序,它的运行时间将为
O(n*m log m)
。但是,对于较大的m,这意味着只需在列表中进行迭代并进行更多的内联比较,就会导致最坏的情况是
O(n*m)
.cool.但是你能把列表分成两部分,找到这两部分的最大元素,然后比较两个数字吗?当“部分”中有两个最大的数字时,这种方法会出现问题。也许你可以从这种称为合并排序的排序算法中得到一个想法。它可以将列表分成两部分,但它是对列表进行排序的。(参见
alist = [-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
largest = 0
second_largest = 0
for large in alist:
  if second_largest < large:
    second_largest = large

  if largest < large:
    temp = second_largest
    second_largest = largest
    largest = temp

print "First Highest:- %s" %largest
print "Second Highest:- %s" %second_largest
if __name__ == '__main__':
    alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
    alist1 = [ ]
    [alist1.append(x) for x in alist if x not in alist1]
    alist1.sort()
    print alist1[-2]
alist=[10, 0,3,10,90,5,-2,4,18,45,707, 100,1,-266,706, 1]
print(max(alist))
second_largest=alist[0]
for i in range(len(alist)):
    if (alist[i]>second_largest and alist[i]!=max(alist)):
        second_largest=alist[i]
print(second_largest)
 list1=[1,10,2,3,5,7,1,-32,90,99,99]
 max=0
 secmax=0
 for i in list1:
    if i>max:
       max=i
 for i in list1:
    if i>secmax and max!=i:
      secmax=i
 print(secmax)