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)