2017-04-30 116 views
0

我已經列出了包含學生標記和主題的目錄和列表。我想排序基於總學生記錄並更換未發現學生用0.1按Python中字典列表的聚合值排序

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

預期輸出的主題:

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 

,我已經邏輯用於下面的代碼並不是很好。我最終的輸出結果就像根據總數排序學生記錄。

示例代碼:

>>> 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'沒有取得unicode字符串的?爲什麼'student_2'具有'subj_N'而不是'sub_N'?爲什麼你使用'sys.stdout.write'而不是''帶尾隨''的'print'來防止換行,或者用'print(...,end ='')''從__future__ import print_function'? –

回答

1

可以使用get用默認值來獲得每個主題或0檔次,如果這個問題不存在。然後,只需獲得sum那些,並使用它作爲key進行排序,按reverse順序排列。

此外,您可以簡化循環的主體,再次使用get默認結合str.join而不是內部雙重for循環。

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