需要关于namedtuple示例的建议

时间:2014-10-18 14:41:07

标签: python python-2.7

我正在尝试编写一个程序,其中包含卷号,名称和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]}

现在我想对总标记进行排序并相应地显示相应的名称和百分比。

我不确定如何对总分数进行排序并与学生姓名保持联系。 请建议。

1 个答案:

答案 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)