我正在尝试编写一个程序,其中包含卷号,名称和3名学生的物理,化学和数学标记。计算总分和&所有学生的百分比和在屏幕上显示优点列表。
我用'namedtuple'尝试了这个但是我已经卡住了,如果我的方法不对,我不知道。
from collections import namedtuple
SInfo = namedtuple('SInfo', 'RNo Name M_P M_C M_M')
student1 = SInfo('123','Appy','60','90','65')
student2 = SInfo('124','Banny','30','60','75')
student3 = SInfo('125','Sammy','50','70','85')
students = [student1,student2,student3]
result = {}
for i in range(0,3):
Total_Marks = int(students[i].M_P) + int(students[i].M_C) + int(students[i].M_M)
list1 = []
list1.append(students[i].Name) # Student Name
list1.append(Total_Marks) # Total Marks
list1.append(Total_Marks/3) # Percentage
result[students[i].RNo] = list1
现在,如果我打印'res'字典,我会得到以下内容(如预期的那样):
print result
{'123': ['Appy', 215, 71], '124': ['Banny', 165, 55], '125': ['Sammy', 205, 68]}
现在我想对总标记进行排序并相应地显示相应的名称和百分比。
我不确定如何对总分数进行排序并与学生姓名保持联系。 请建议。
答案 0 :(得分:3)
您可以使用sorted
。它可以采用key
参数,该参数应该是一个函数,它返回值以对序列进行排序。
>>> res = {'123': ['Appy', 215, 71], '124': ['Banny', 165, 55], '125': ['Sammy', 205, 68]}
>>> sorted(res.items(), key=lambda item: item[1][2], reverse=True)
[('123', ['Appy', 215, 71]),
('125', ['Sammy', 205, 68]),
('124', ['Banny', 165, 55])]
lambda item: item[1][2]
表示一个映射如下内容的函数:
(RNo, (Name, Total, Percentage)) -> Total
如果我可以为您的代码提出建议,那么列表通常不会用于不同类型的内容。你应该使用一个元组,甚至更好的一个名字元组(也许一个叫STotal
?)
result[students[i].RNo] = (students[i].Name,
Total_Marks,
Total_Marks/3)