2017-04-30 12 views
0

私はディレクトリのリストと生徒のマークと科目のリストを持っています。私がしましたPythonでの辞書リストの集計値で並べ替え

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' Unicode文字列で構成されていない理由?なぜ '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 
関連する問題