Files
Evaluation-Backend/sort_rule.py
T
LufsX 3a3e09592e chore: sync change
fix: detail info
2024-10-11 19:57:30 +08:00

70 lines
1.9 KiB
Python

def sort_by_time(data, limit=30):
"""
按时间排序
"""
sorted_data = sorted(data, key=lambda x: x["time"], reverse=True)
return sorted_data[:limit] if limit > 0 else sorted_data[::-1][: abs(limit)]
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_by_id(data, limit=True):
"""
按学号排序,取对应的最高分,若分数相同则取最短运行时间
"""
# 学号升序,分数降序,运行时间升序
sorted_data = sorted(data, key=lambda x: (x["id"], -x["score"], x["running_time"]))
# 字典去重
unique_students = {}
for record in sorted_data:
id = record["id"]
if id not in unique_students:
unique_students[id] = record
return list(unique_students.values())[
: len(unique_students) if limit == True else abs(limit) : (
1 if limit > 0 else -1
)
]
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
return list(best_scores_by_id.values())[:: 1 if limit > 0 else -1][: abs(limit)]