如何从python3中的用户输入计算最小值和最大值

时间:2013-02-05 19:47:16

标签: python max min

def main():
    print("*** High School Diving ***")

    num_judges=int(input("How many judges are there? "))

    for i in range (num_judges):
            scores=int(input("Ender a score: " ))
    x=min(scores)
    y=max(scores)

    print("Min: ", x)
    print("Max: ", y)

main()

4 个答案:

答案 0 :(得分:1)

您需要使用一个列表,并将每个输入的分数附加到其中:

scores = []
for i in range (num_judges):
    scores.append(int(input("Enter a score: " )))
然后

max()min()将分别从该列表中选择最高和最低值。

相反,您每次循环时都使用新值替换 scores;然后尝试找到一个整数的min(),这不起作用:

>>> min(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

通过使用列表,min()函数可以遍历它(迭代)并找到您的最小值:

>>> min([1, 2, 3])
1

答案 1 :(得分:1)

以下是您可以采取的更多方法。

首先,至少有两个人已经发布了与Martijn Pieters的回答第一个答案完全相同的内容,我不想感到被遗忘,所以:

scores = []
for i in range(num_judges):
    scores.append(int(input("Enter a score: ")))
x=min(scores)
y=max(scores)

现在,每当您创建一个空列表并在循环中追加它时,这与列表推导相同,所以:

scores = [int(input("Enter a score: ")) for i in range(num_judges)]
x=min(scores)
y=max(scores)

同时,如果num_judges很大,并且您不想仅仅为了找到最小值和最大值而构建那么大的列表呢?好吧,你可以随时跟踪它们:

x, y = float('inf'), float('-inf')
for i in range(num_judges):
    score = int(input("Enter a score: "))
    if score < x:
        x = score
    if score > y:
        y = score

最后,有没有办法让两全其美?通常,这只是意味着使用生成器表达式而不是列表推导。但是在这里,您需要minmax来遍历分数,这意味着它必须是一个列表(或其他可重用的东西)。

您可以使用tee

解决此问题
scores= (int(input("Enter a score: ")) for i in range(num_judges))
scores1, scores2 = itertools.tee(scores)
x = min(scores1)
y = max(scores2)

然而,这并没有什么帮助,因为在幕后,tee将创建您已经创建的相同列表。 (tee在你要并行遍历两个迭代器时非常有用,但在这种情况下则不行。)

所以,你需要编写一个min_and_max函数,它看起来很像上一个例子中的for循环:

def min_and_max(iter):
    x, y = float('inf'), float('-inf')
    for val in iter:
        if val < x:
            x = val
        if val > y:
            y = val
    return x, y

然后,你可以用一个漂亮,可读的单行完成整个事情:

x, y = min_and_max(int(input("Enter a score: ")) for i in range(num_judges))

当然,当你必须编写一个8行函数才能使它工作时,它并不是真正的单线程...除了8行函数在将来的其他问题中可以重用。

答案 2 :(得分:0)

您正在for循环中创建一个变量scores,该变量在其外部不可见。其次,您试图在每次迭代中覆盖scores中的值,因为scores不是list而是scalar类型。

您应该在循环外部将scores声明为list类型,并在循环内部append将每个分数声明到列表中。

scores = []
for i in range (num_judges):
        scores.append(int(input("Ender a score: " )))
x=min(scores)
y=max(scores)

答案 3 :(得分:0)

你几乎就在那里,你只需要让scores列表并附加到它,然后这应该有效:

def main():
    print("*** High School Diving ***")

    num_judges=int(input("How many judges are there? "))

    #define scores as a list of values
    scores = []
    for i in range (num_judges):
            scores.append(int(input("Ender a score: " ))) #append each value to scores[]
    x=min(scores)
    y=max(scores)

    print("Min: ", x)
    print("Max: ", y)

main()

如果你看一下max()min()的文档,他们实际上会给你一个语法,它需要一个可迭代的类型(例如非空字符串,元组或列表) )。