2014-10-18 4 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 

는 지금, 나는 (예상대로) 다음 얻을 :

print result 
{'123': ['Appy', 215, 71], '124': ['Banny', 165, 55], '125': ['Sammy', 205, 68]} 

가 지금은 전체 표시를 정렬하고 그에 따라 해당 이름과 비율을 표시합니다.

총 점수를 정렬하고 학생 이름과 연결된 상태를 유지하는 방법을 모르겠습니다. 제안 해주세요.

답변

3

sorted을 사용할 수 있습니다. key 인수를 사용할 수 있습니다.이 인수는 시퀀스를 정렬하는 값을 반환하는 함수 여야합니다.

(RNo, (Name, Total, Percentage)) -> Total 

난 당신의 코드에 대한 제안,리스트는 일반적으로 같은 유형이 아닌 것을 사용되지 않습니다 할 수있는 경우 :

>>> 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]

는 다음과 같이 매핑하는 기능을 의미한다. 당신은 튜플, 또는 더 나은하는 namedtuple (어쩌면 하나 STotal라고?)

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

헤이 덕분에! ... 단 하나 개의 질문, 여기에서 '= 진정한 반전'의미 하는가를 사용해야합니까? – Ejaz

+1

@ user3342969 내림차순, 즉 높은 숫자부터 정렬하는 것을 의미합니다. 점수를 계산할 때 처음 점수가 가장 높게 책정되기를 원한다고 생각했습니다. – parchment

+0

좋아요. 이제 알 겠어요. 고마워요 !! :) – Ejaz

관련 문제