[英]Find the second largest number in a list of numbers using python3
我知道这个问题有答案 ,但是我的代码存在的问题是,它可以在大多数情况下工作,除非打印出最大数量。 只要列表中的前两个或更多为最大。 听起来可能有些混乱,但这是我的示例代码。
def s_max(l):
pos = 0
m1 = max(l)
m2 = 0
for i in l:
pos += 1
if i > m2 and i != m1:
m2 = i
elif m2 == 0 and i == m1 and pos > 1:
m2 = m1
elif i < m1 and i <= m2:
i = m2
else:
m2 = m2
print(m2)
s_max([10,10,9])
OUTPUT = 10
当我使用数字列表,例如[9,10,10]时,代码将输出9。
您可以尝试这样做:
def s_max(l):
while 1:
val=max(l)
l.remove(val)
if val not in l: break
return max(l)
output=s_max([10,10,9])
print(output) #prints 9
在执行if-else
块之前的for
循环的第一次迭代中,变量具有以下值:
m1 = 10
m2 = 0
i = 10
pos = 1
这意味着将执行最后的else
分支,并且由于它设置了m2=m2
没有任何变化。
在第二次迭代中, if-else
之前if-else
值相同, 只是 pos = 2
。 现在,这将导致第二个分支执行:
elif m2 == 0 and i == m1 and pos > 1:
m2 = m1
在此将m2
设置为已找到的最大值。 在第三次迭代中if-else
执行if-else
块中的第三个分支,该分支不会发生任何变化,因为您只需将值分配给循环变量。
如果两个第一个值是列表中的最大项目,则所有代码都会失败。 如果i
大于当前m2
但小于最大值,则只需进行最小的修改即可设置m2
:
def s_max(l):
m1 = max(l)
m2 = 0
for i in l:
if m2 < i < m1:
m2 = i
print(m2)
如果您不想编写自己的函数,可以使用heapq.nlargest
:
>>> import heapq
>>> l = [10, 10, 9]
>>> heapq.nlargest(2, set(l))[1]
9
请注意,以上假设您的列表中有两个唯一值。
您可以通过排序找到第二大数字
>>> l = [1, 9, 8, 5, 2, 1, 7]
>>> second_largest_number = sorted(l)[-2]
>>> print(second_largest_number)
Output: 8
您可以使用以下功能,而无需使用排序
def f(l):
a = l[0]
b = l[0]
for i in l:
if i > a and i > b:
b = a
a = i
elif i > b:
b = i
elif b == a:
b = i
return b
>>> l = [1, 9, 8, 5, 2, 1, 7]
>>> f(l)
Output: 8
方式不使用只是排序和设置:
l=[9, 10, 10, 11, 12, 12, 11]
sorted(set(l))[-2]
输出:
11
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.