Python 如何从for循环中找到最小值?

Python 如何从for循环中找到最小值?,python,for-loop,math,min,Python,For Loop,Math,Min,我试图从第一个循环中找到的最小值,但我希望避免使用列表,因为我希望程序运行得更快。在不使用列表的情况下,我如何做到这一点?我将继续讨论,并尝试根据您的代码猜测您想要什么-这基本上只保留一个变量,并检查每个循环的最小值(如果需要,相应地更新): base,area=input().strip().split() 基础,面积=int(基础),int(面积) 最小位置=1 最小触发=绝对值(基准/2-面积)#立即计算第一个 对于范围(2,面积+1)内的i:#从第二个开始循环。。。 形式=abs((基准

我试图从第一个
循环中找到
的最小值,但我希望避免使用列表,因为我希望程序运行得更快。在不使用列表的情况下,我如何做到这一点?

我将继续讨论,并尝试根据您的代码猜测您想要什么-这基本上只保留一个变量,并检查每个循环的最小值(如果需要,相应地更新):

base,area=input().strip().split()
基础,面积=int(基础),int(面积)
最小位置=1
最小触发=绝对值(基准/2-面积)#立即计算第一个
对于范围(2,面积+1)内的i:#从第二个开始循环。。。
形式=abs((基准*i)/2-面积)
如果形式<最小触发:
min_pos=i
最小触发=形式
打印(最小位置)
更新

如评论中所述,上述将只找到单个最小值的索引,因此只有存在一个最小值时才是正确的。如果您需要最小值列表,可以执行以下操作:

base, area = input().strip().split()
base, area = int(base), int(area)

min_pos = 1
min_trig = abs(base / 2 - area)  # calculate the first immediately
for i in range(2, area + 1):  # loop from the second...
    form = abs((base * i) / 2 - area)
    if form < min_trig:
        min_pos = i
        min_trig = form

print(min_pos)
base, area = input().strip().split()
base, area = int(base), int(area)

min_pos = [1]  # initialize the first index as a minimum immediately
min_trig = abs(base / 2 - area)  # calculate the first trig as a minimum immediately
for i in range(2, area + 1):  # loop from the second...
    trig = abs((base * i) / 2 - area)
    if trig == min_trig:
        min_pos.append(i)
    elif trig < min_trig:
        min_pos = [i]
        min_trig = trig

print(min_pos)  # prints you a list of all minimum positions
base,area=input().strip().split()
基础,面积=int(基础),int(面积)
min_pos=[1]#立即将第一个索引初始化为最小值
最小触发=abs(基准/2-面积)#立即计算第一个触发作为最小值
对于范围(2,面积+1)内的i:#从第二个开始循环。。。
三角=绝对值((基准*i)/2-面积)
如果触发=最小触发:
最小位置附加(i)
elif触发器<最小触发器:
最小位置=[i]
最小触发=触发
打印(最小位置)#打印所有最小位置的列表

这样,您就不必将所有内容存储在单独的列表中,也不必进行双循环。纯O(N)解决方案。

基于您的代码现在所做的,我创建了另一个版本的片段,它基本上做了相同的事情。我用输入字符串
“516”
对它进行了测试,它似乎工作正常。我使用的代码如下:

base, area = input().strip().split()
base, area = int(base), int(area)

min_pos = 1
min_trig = abs(base / 2 - area)  # calculate the first immediately
for i in range(2, area + 1):  # loop from the second...
    form = abs((base * i) / 2 - area)
    if form < min_trig:
        min_pos = i
        min_trig = form

print(min_pos)
base, area = input().strip().split()
base, area = int(base), int(area)

min_pos = [1]  # initialize the first index as a minimum immediately
min_trig = abs(base / 2 - area)  # calculate the first trig as a minimum immediately
for i in range(2, area + 1):  # loop from the second...
    trig = abs((base * i) / 2 - area)
    if trig == min_trig:
        min_pos.append(i)
    elif trig < min_trig:
        min_pos = [i]
        min_trig = trig

print(min_pos)  # prints you a list of all minimum positions
这使用列表理解来创建一个包含所有索引的新数组,其中出现的索引数最小

可以找到用于查找所有出现的最小值元素的代码


当我用
“5 16”
测试我的代码时,输出是
[6,7]

如果我错了,请纠正我,但是第一个值不总是最小的吗…?你到底想实现什么?你可以将最小值存储在一个变量中,比如
minTrig=min(trig)
然后在
中使用该值,如果form==minTrig:
。这样,您就不会在第二个for循环中每次都调用
min()
。第一个for循环的值并不总是最小的。我刚刚试着运行一个小测试,最小值稍后会出现在trig数组中。这个解决方案不起作用,因为OP希望(索引+1)用于所有出现的最小值。对于这个问题,时间复杂度最低的解决方案是O(N),因为必须先创建列表,然后才能找到最小值。这是我的错,无法读懂OP的心思。。。他希望在上面更新这个更容易的位置。如果它是一个数组,它可以解释多个索引,而不是将min_pos作为一个索引。将
min\u pos=i
更改为
min\u pos.append(i)
。在我的解决方案中,我做了一些非常类似的事情。这对它没有帮助——上面的方法只适用于单一的解决方案,因为它没有预测未来的能力。如果
min\u pos
是一个列表,它将包含当时最小值的多个索引。