我想创建一个应用程序来读取 4 名学生的姓名和成绩,打印平均数并说明哪个学生高于平均数。例如:
- 学生 1:约翰
- John 的成绩:90
- 学生 2:保罗
- Paul 的成绩:85
- 学生 3:林戈
- 林戈的成绩:80
- 学生 4:
- George 的成绩:75
平均成绩为 82.5,John 和 Paul 高于平均水平。这是我的代码:
grade_list = []
st1 = input("Sudent 1: ")
grade1 = int(input("Grade of %s: " % (st1)))
st2 = input("Student 2: ")
grade2 = int(input("Grade of %s: " % (st2)))
st3 = input("Student 3: ")
grade3 = int(input("Grade of %s: " % (st3)))
st4 = input("Student 4: ")
grade4= int(input("Grade of %s: " % (st4)))
avg = (grade1 + grade2 + grade3 + grade4) / 4
grade_list.append(grade1)
grade_list.append(grade2)
grade_list.append(grade3)
grade_list.append(grade4)
for x in grade_list:
if x > avg:
print(x)
我可以打印出高于平均水平的学生的成绩,但是如何打印他们的名字呢?我试图对 grades_list 进行排序并为名称创建一个新列表,但这对我没有帮助。有小费吗? (对不起标题不好)
最佳答案
首先,让我稍微简化一下您的代码,让其余部分变得更容易。而不是这个:
grade_list = []
# ...
grade_list.append(grade1)
grade_list.append(grade2)
grade_list.append(grade3)
grade_list.append(grade4)
……你可以这样做:
grade_list = [grade1, grade2, grade3, grade4`]
现在,您构建第二个姓名列表:
name_list = [st1, st2, st3, st4]
现在您可以使用 zip
循环遍历两个列表:
for name, grade in zip(name_list, grade_list):
if grade > avg:
print(name, grade)
... 或者您可以遍历 grade_list
的索引而不是成员:
for i in range(len(grade_list)):
if grade_list[i] > avg:
print(name_list[i], grade_list[i]))
第一个显然更简洁、更简洁,所以如果您能理解 zip
的工作原理,那么您可能应该使用第一个。
但是让我告诉你一个更好的方法来解决这个问题:
students, grades = [], []
for i in range(4):
students = input(f"Student {i+1}: ")
grade = int(input(f"Grade of {st}: "))
students.append(student)
grades.append(grade)
avg = sum(grades) / len(grades) # or, even better, statistics.mean(grades)
for name, grade in zip(names, grades):
if grade > avg:
print(name, grade)
现在,您不必重复四次 — 而且,如果您想将其更改为处理 John、Paul、Ringo、George 和 Brian,甚至询问用户要处理多少学生,您只需要将 4
替换为 5
或 int(input("How many students? "))
,其余代码仍然有效。
(如果您不使用 Python 3.6,则不能使用像 f"Student {i+1}: "
这样的“f-strings”,但您可以将它们更改为使用 %
,因为你已经习惯了。)
在掌握了基础知识后可以尝试的其他想法:
- 使用成对列表(包含两个元素的元组或列表),而不是一对列表。
- 使用一些非常简单的类的实例列表(可能使用
namedtuple
、@dataclass
或@attr
构建),而不仅仅是对。 - 使用
dict
而不是成对列表。请注意,这要求名称是唯一的(您可能确实希望如此),并且放弃了任何顺序概念。- 或者使用
OrderedDict
,它可以在不丢失顺序的情况下为您带来同样的好处。 - 或者使用第三方集合类,例如
blist.sorteddict
,它可以按名称、等级或任何您想要的方式对事物进行排序。
- 或者使用
这些都有不同的优点和缺点,因此值得通过一堆来进行比较。 jpp's answer演示了 dict
解决方案——如您所见,它在某些方面更清晰、更简单,但在其他方面则不然。
关于python - 条件打印输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50614128/