按Python中字典列表的聚合值排序

时间:2017-04-30 15:57:17

标签: python python-2.7

我列出了包含学生分数和科目的目录和列表。我想根据总数对学生记录进行排序,并替换为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']

预期输出:

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

1 个答案:

答案 0 :(得分:1)

您可以使用get使用默认值来获取每个主题的成绩,如果该主题不存在,则使用0。然后只需获取sum的{​​{1}},并将其作为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