Files
Evaluation-Backend/sort_rule.py
T
2024-11-03 19:12:28 +08:00

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)