70 lines
1.9 KiB
Python
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)]
|