一尘不染

如何在 Python 中找到最小值?

py

此函数查找最大值和最小值。

n=int(input())
array=list(map(int,input().split))

for i in range(n):
    max=array[0]
    if i>0:
        if max<array[i]:
            max=array[i]

for i in range(n):
    min=array[0]
    if i>0:
        if min>array[i]:
            min=array[i]   

print(max,end='')
print(     min)

最大值正常出现,但最小值作为第一个数组值出现。我找不到什么问题:(

你能教我什么是错的吗?

太感谢了!


阅读 107

收藏
2022-10-08

共2个答案

一尘不染

最大值正常出来

我认为它只是因为你的第一个或最后一个值是序列的最大值。因为您在每次迭代时min都完全重置。所以整个循环是没用的,任何迭代,但最后一次都没有效果。max

初始化应该在循环之外,而不是在循环内部:

max=array[0]
for i in range(n):
    if i>0:
        if max<array[i]:
            max=array[i]

min=array[0]
for i in range(n):
    if i>0:
        if min>array[i]:
            min=array[i] 

此时对索引的检查显然是不必要的:要么吃掉不必要的array[0]to比较array[0](它本身无害),要么在迭代时跳过索引:

max=array[0]
for i in range(1, n):
    if max<array[i]:
        max=array[i]

min=array[0]
for i in range(1, n):
    if min>array[i]:
        min=array[i] 

本质上,您编写了一个非常复杂的版本:

if array[0] < array[-1]:
    max = array[-1]
else:
    max = array[0]

if array[0] > array[-1]:
    min = array[-1]
else:
    min = array[0]

现在为了进一步改进,假设您正在尝试学习,我们将忽略它min并且max已经是内置函数,因此整个事情是多余的(尽管您不应该自己的变量命名为与内置函数相同,因为造成混乱):

  • n没用,因为它没有被检查array并且array有自己的长度,n如果它超过len(array),只会触发不必要的错误,或者如果它小于 ,则跳过项目len(array)n如果例如输入是在经过验证的调用循环中收集的,则可能很有用input(),但事实并非如此。
  • 良好的错误处理可能会检查数组的长度是否至少为 1,否则脚本会崩溃(尽管在转换为整数之前它还需要检查各个输入值是否有效,所以......)
  • 您可以在同一个循环中提取最小值和最大值,无需循环两次(在这种情况下可能不是很重要)。
  • 但是 Python 对迭代器也有很好的支持,所以你应该避免在不必要的时候显式索引,这里没有。

我的看法,仍然在努力学习的范围内,将是:

array=list(map(int,input().split))

low = high = array[0]
for candidate in array[1:]:
    if candidate > high:
        high = candidate
    if candidate < low:
        low = candidate

print(f"{low} ... {high}")

另一个有趣的替代方法是对数组进行排序并获取已排序数组的第一个和最后一个元素:

array=list(map(int,input().split))

low, *_, high = sorted(array)

print(f"{low} ... {high}")

尽管它的缺点是它仅适用于长度为 2+ 的数组,而原始数组适用于“单例”数组。

2022-10-08
一尘不染

sa=sorted(array); low=sa[0] ; high=sa[-1]也可以在“单例”数组上解决问题:)

2022-10-08