这里有更多的方法你可以做到这一点。
首先,至少有两个人已经发布了与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
最后,有没有办法让这两个世界都得到最好的结果?通常,这只是意味着使用生成器表达式而不是列表理解。但在这里,您需要min和max来遍历分数,这意味着它必须是一个列表(或其他可重用的东西)。
你可以通过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行函数在将来的其他问题中可能是可重用的。