我想创建一个应用程序,读取4名学生的姓名和成绩,打印平均值,并说明哪个学生高于平均水平。例如:
成绩平均为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进行排序并为名称创建一个新列表,但它对我没有帮助。有小费吗? (抱歉标题不好)
答案 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)
替换为4
或5
,其余代码仍然可以使用。
(如果你没有使用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]]
我就是这样做的。