2014-10-18 3 views
0

Я пытаюсь написать программу, которая принимает номер рулона, имя & Знаки физики, химии и математики 3 студентов. Рассчитать итоговые оценки & процент для всех учащихся & отображает список заслуг на экране.Нужно предложение на примере namedtuple

Я попробовал это с '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]} 

Теперь я хочу, чтобы отсортировать общие знаки и отображать соответствующие имена и процент соответственно.

Я не уверен, как сортировать полные отметки и оставаться на связи с именем студента. Пожалуйста, предложите.

ответ

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 

Если я могу сделать предложение для вашего кода, списки, как правило, не используются для вещей, которые не одного и того же типа. Вы должны использовать кортеж, или даже лучше, namedtuple (возможно, один называется STotal?)

result[students[i].RNo] = (students[i].Name, 
          Total_Marks, 
          Total_Marks/3) 
+0

эй спасибо !! ... только один вопрос, что такое «обратное = True» здесь означает? – Ejaz

+1

@ user3342969 Это означает сортировку по убыванию, т. Е. Более высокие номера. Поскольку вы вычисляете баллы, я предположил, что вы хотите, чтобы у первого был самый высокий балл. – parchment

+0

Ладно .. Я получаю это сейчас ... Большое спасибо! :) – Ejaz

Смежные вопросы