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)