Skip to main content
 首页 » 编程设计

python之条件打印输入

2025年05月04日22zhengyun_ustc

我想创建一个应用程序来读取 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 解决方案——如您所见,它在某些方面更清晰、更简单,但在其他方面则不然。