84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
def sort_by_rule(data, sort_by, limit):
|
|
"""
|
|
根据 sort_by 参数对返回的数据排序
|
|
"""
|
|
# 规则定义
|
|
sort_rules = {
|
|
"time": sort_by_time,
|
|
"score": sort_by_score,
|
|
"id": sort_by_id,
|
|
}
|
|
|
|
# 排序
|
|
sorted_data = (
|
|
sort_rules[sort_by](data, int(limit)) if limit else sort_rules[sort_by](data)
|
|
)
|
|
|
|
# 恢复格式
|
|
for score in sorted_data:
|
|
score["running_time"] = f"{score['running_time']}ms"
|
|
score["time"] = score["time"].strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
return sorted_data
|
|
|
|
|
|
def sort_limit(data, limit):
|
|
"""
|
|
排序和限制
|
|
[::reverse][:end]
|
|
"""
|
|
if limit is None:
|
|
end = len(data)
|
|
reverse = 1
|
|
else:
|
|
end = abs(limit)
|
|
reverse = 1 if limit > 0 else -1
|
|
|
|
return data[::reverse][:end]
|
|
|
|
|
|
def sort_by_time(data, limit=30):
|
|
"""
|
|
按时间排序
|
|
"""
|
|
sorted_data = sorted(data, key=lambda x: x["time"], reverse=True)
|
|
return sort_limit(sorted_data, limit)
|
|
|
|
|
|
def sort_by_id(data, limit=None):
|
|
"""
|
|
按学号排序,取对应的最高分,若分数相同则取最短运行时间
|
|
"""
|
|
|
|
# 学号升序,分数降序,运行时间升序
|
|
sorted_data = sorted(data, key=lambda x: (x["id"], -x["score"], x["running_time"]))
|
|
|
|
# 按照姓名@学号唯一去重
|
|
unique_students = []
|
|
unique_students_id_name = set()
|
|
for score in sorted_data:
|
|
if f"{score['name']}@{score["id"]}" not in unique_students_id_name:
|
|
unique_students.append(score)
|
|
unique_students_id_name.add(f"{score['name']}@{score["id"]}")
|
|
|
|
return sort_limit(unique_students, limit)
|
|
|
|
|
|
def sort_by_score(data, limit=10):
|
|
"""
|
|
处理个人最高分,按分数降序、运行时间升序排序
|
|
"""
|
|
# 分数降序,运行时间升序
|
|
scores_sorted = sorted(data, key=lambda x: (-x["score"], x["running_time"]))
|
|
|
|
# 字典去重
|
|
best_scores_by_id = {}
|
|
for score in scores_sorted:
|
|
student_id = score["id"]
|
|
if student_id not in best_scores_by_id:
|
|
best_scores_by_id[student_id] = score
|
|
|
|
scores = list(best_scores_by_id.values())
|
|
|
|
return sort_limit(scores, limit)
|