2017-04-30 1 views
0

나는 학생 목록과 주제 목록과 목록을 가지고있다. 나는했습니다파이썬에서 사전 목록 집계 값으로 정렬

Student  sub_1 sub_2 sub_3 sub_4 sub_5 sub_6 
student_3 81  0  67  0  72  0 
student_1 51  72  0  62  0  0 
student_2 45  56  0  0  0  71 

논리 : 나는 총을 기준으로 학생 기록을 정렬하고 0

student_data=[{u'sub_1': 51, u'sub_2': 72, u'sub_4': 62, 'user': u'student_1'}, {u'subj_1': 45, u'subj_2': 56, u'subj_6': 71, 'user': u'student_2'}, {u'sub_1': 81, u'sub_3': 67, u'sub_5': 72, 'user': u'student_3'}] 
subjects=['sub_1','sub_2','sub_3','sub_4','sub_5','sub_6'] 

와 학생에 대한 예상 출력을 찾을 수없는 주제를 교체하고 싶습니다 다음 코드에서 사용되는 것은 좋지 않습니다. 내 최종 결과물은 총계를 기준으로 학생 기록을 정렬하는 것과 같습니다.

샘플 코드 : 그 대상이 존재하지 않는 경우

>>> for student in student_data: 
...  sys.stdout.write('\n' + '{:20s}'.format(student['user'])) 
...  del student['user'] 
...  for k, v in student.items(): 
...   for i in subjects: 
...    if i == k: 
...     sys.stdout.write('{:5s}'.format(str(v))) 
...    else: 
...     sys.stdout.write('{:5s}'.format(str("0"))) 
... 

student_1   0 72 0 0 0 0 51 0 0 0 0 0 0 0 0 62 0 0  
student_2   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  
student_3   0 72 0 0 0 0 0 0 67 0 0 0 81 0 0 0 0 0 >>> 
+0

왜'유니 코드 문자열로 만들어지지 subjects'입니까? 왜'student_2'는'sub_N' 대신'subj_N'을 사용합니까? 왜 당신은'print' 대신에'sys.stdout.write'를 사용하고,'print'(..., end = '')'로''__future__ import print_function'을 사용합니까? –

답변

1

당신은 각 과목 또는 0에 대한 점수를 얻을 수있는 기본 값으로 get을 사용할 수 있습니다. 그런 다음 sum을 가져 와서 key으로 정렬하고 reverse 순서로 사용하면됩니다.

또한 get을 사용하여 다시 루프 본문을 단순화 할 수 있으며 루프 대신 str.join 루프를 기본으로 사용합니다.

for student in sorted(student_data, 
         key=lambda d: sum(d.get(subj, 0) for subj in subjects), 
         reverse=True): 
    scores = "".join(("{:3}".format(student.get(subj, 0)) for subj in subjects)) 
    print("{:10s} {}".format(student["user"], scores)) 

출력 :

student_3 81 0 67 0 72 0 
student_1 51 72 0 62 0 0 
student_2 0 0 0 0 0 0