python - 条件打印输入

标签 python

我想创建一个应用程序来读取 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 替换为 5int(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/

相关文章:

Python 子进程 check_output 比调用慢得多

python - 在python中读取csv文件时跳过第二行数据帧

python - 使用 pySerial 读取响应 AT 命令

Python3 子进程模块 : Passing an empty variable as a flag, 可能吗?

python - xgboost 预测对概率的贡献

python - 从 pandas 数据帧的特定行检索信息

python - 从 Python 中的 Splunk 搜索返回错误数

python - 使用 numpy.clip 将正值和负值转换为位串

python - 有上行字符吗? (与\n相反)

python - 如何计算 pandas 中两个数据帧的平均值?