我正在尝试编写代码来查找列表的第二个最大值。
我是这样试的:
arr = map(int, input().split())
lista = list(arr)
max_value = lista[0]
run = lista[0]
for i in lista:
if max_value < i:
max_value = i
for j in lista:
if run < j and run < max_value:
run = j
print(run)
字符串
第二个最大值和最大值是一样的,我的程序中有什么错误?
6条答案
按热度按时间omvjsjqw1#
问题
最低还款额
字符串
应
型
如何找到问题
1.简化代码
理解而不是Map列表构造函数继承
我们可以通过使用一个理解而不是一系列的map和list构造函数来减少firsts行的样板:
型
变成:
型
向Python询问最大值,不要自己动手
你的下一个逻辑块是在这里找到列表的最大值。你不需要自己写这个代码,你可以问Python。这将降低你的代码的复杂性,使问题/bug更容易发现。
型
变成:
型
重命名变量
为了帮助我们的大脑理解发生了什么,让我们来澄清变量的名称:
型
变成:
型
2.发现问题
现在,代码更小,更容易理解,出错的地方也更少。如果有错误,我们不必查看很多地方。
出了什么问题?
second_max
应该是第二个最大值,但实际上不是。是什么导致了这一点?previous_value
的更新不应该发生。所以这就是问题可能发生的地方。
型
归因正确的,条件应该是错误的。
这似乎是正确的
second_max < current_value
,因为我们希望仅在second_max
低于current_value(这意味着current可能是second_max
的真实值或等于max_value
)时才进行更新。因此,我们需要另一个条件:current_value
不应是max_value
,否则,second_max
可能被设置为max_value
。然后,我们看第二个条件:
second_max < max_value
,这是我们的错误。让我们修正这个条件,因为
current_value
应该小于max_value
。此外,如果第一个值是最大值,则需要将second_max
的初始值设置为最小值。型
完了
替代方法:使用集合、排序和索引
如果您想要清单中的第二个最大值,排序已删除重复的清单并打印清单索引1处的元素(例如第二个元素)会比较容易。
逐步示例
型
单线示例
型
用堆
型
hm2xizp92#
第二个循环中的测试是不正确的,使用这个:
字符串
检查值(
j
)不应等于max_value
。xtupzzrd3#
有趣的是,与其他common ways方法相比,您的方法(具有逻辑校正)非常快。在下面的基准测试中,它是
f1
。这是一个在线基准。
如果你想在自己的电脑上试试,代码是:
字符串
在最近的Mac上,这将打印:
型
q43xntqr4#
我会这样写代码:
字符串
将函数拆分后,代码更易于测试。调用者类似于海报的代码如下所示:
型
如果传入的列表中只有一个唯一值或没有值,则代码将引发IndexError异常。
下面是我测试的简单数据:
型
2023-11-14
你可以像这样为下面的基准测试代码编写代码:
型
或者像这样的数据集有几个重复:
型
第二个实现是目前为止最快的替代方案,根据基准测试代码,比f8快66%。
t30tvxxf5#
字符串
voj3qocg6#
答案无法解决列表以最大值开始的异常。要解决它,
字符串
在第二个
for
中,j!=max_value
和j<max_value
都可以工作。