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)]