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