条件

时间:2018-05-30 22:23:36

标签: python

我想创建一个应用程序,读取4名学生的姓名和成绩,打印平均值,并说明哪个学生高于平均水平。例如:

  • 学生1:约翰
    • 约翰等级:90
  • 学生2:保罗
    • 保罗等级:85
  • 学生3:林戈
    • 林戈等级:80
  • 学生4:
    • 乔治年级:75

成绩平均为82.5,约翰和保罗高于平均水平。这是我的代码:

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)

我能够打印高于平均水平的学生成绩,但我该如何打印他们的名字?我已经尝试对grade_list进行排序并为名称创建一个新列表,但它对我没有帮助。有小费吗? (抱歉标题不好)

3 个答案:

答案 0 :(得分:3)

首先,让我简化一下你的代码,使其余部分更容易。而不是:

<div class="dropdown">
  <button onclick="myFunction()" class="dropbtn">Dropdown</button>
  <div id="myDropdown" class="dropdown-content">
    <label><input type="checkbox" value="Vanilla">Vanilla</label>
    <label><input type="checkbox" value="Chocolate">Chocolate</label>
    <label><input type="checkbox" value="Strawberry">Strawberry</label>
  </div>
</div>

......你可以这样做:

grade_list = []
# ...
grade_list.append(grade1)
grade_list.append(grade2)
grade_list.append(grade3)
grade_list.append(grade4)

现在,您构建了第二个名称列表:

grade_list = [grade1, grade2, grade3, grade4`]

现在,您可以使用zip

以锁定步骤循环遍历两个列表
name_list = [st1, st2, st3, st4]

...或者你可以遍历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) 替换为45,其余代码仍然可以使用。

(如果你没有使用Python 3.6,你不能像int(input("How many students? "))那样使用“f-strings”,但你可以改变那些使用f"Student {i+1}: ",因为你已经习惯了。)

一旦你掌握了基础知识,就可以使用其他想法:

  • 使用对列表(元组或列表,包含两个元素),而不是一对列表。
  • 使用一些非常简单的类(可能使用%namedtuple@dataclass构建)的实例列表,而不仅仅是对。
  • 使用@attr代替配对列表。请注意,这需要名称是唯一的(您可能实际需要),并放弃任何顺序概念。
    • 或使用dict,在不失序的情况下为您提供相同的好处。
    • 或者使用像OrderedDict这样的第三方集合类,可以按名称,等级或任何您想要的内容对事物进行排序。

这些都有不同的优点和缺点,所以值得通过一堆它们进行比较。 jpp's answer演示blist.sorteddict解决方案 - 正如您所看到的,它在某些方面更清晰,更简单,而在其他方面则更少。

答案 1 :(得分:2)

这是@abarnet's post的扩展,显示了构建数据的另一种方法。

如果学生编号不重要,您可以使用无序集合,例如字典。如果排序很重要,可以使用以下解决方案来使用collections.OrderedDict

请注意,字典键必须是唯一的;因此,此结构不允许重复的名称。但是,您可以创建元组字典,以将唯一标识号映射到(名称,分数)。

from statistics import mean

# initialise dictionary
name_grade_dict = {}

# iterate number of students    
for i in range(4):
    student = input(f"Student {i+1}: ")
    grade = int(input(f"Grade of {student}: "))
    name_grade_dict[student] = grade  # add name -> grade mapping to dict

# calculate average using statistics.mean
avg = mean(name_grade_dict.values())

# iterate dictionary using dict.items view
for name, grade in name_grade_dict.items():
    if grade > avg:
        print(name, grade)

答案 2 :(得分:0)

你应该使用一个二维数组(a.k.a。矩阵),这样你就有了一对名字和等级:

[['Student1', grade1],
 ['Student2', grade2],
 ['Student3', grade3],
 ['Student4', grade4]]

我就是这样做的。