# Lab 1.3 - Python 编程实验指导:2维List高级排序 ## 实验目的 1. 理解多列排序的原理和实现 2. 能够将排序技术应用到实际问题中 3. 了解使用 `operator.itemgetter` 进行2维列表排序的方法 ## 实验环境 - Python 3.6+ - 无需额外安装库 ## 实验原理 ### 1. operator.itemgetter 详解 `operator.itemgetter` 是一个函数工厂,用于创建提取序列元素的函数: ```python import operator # 创建获取索引1元素的函数 get_second = operator.itemgetter(1) data = [10, 20, 30] print(get_second(data)) # 输出: 20 # 在排序中的应用 students = [["Alice", 85], ["Bob", 92]] sorted_students = sorted(students, key=operator.itemgetter(1)) ``` **优势**: - 比 lambda 函数性能更好 - 代码更简洁清晰 - 支持多级索引 ### 2. 排序算法基础 [step 1] Python的`sorted()`函数使用Timsort算法,是稳定的排序算法,能够保持相等元素的相对顺序。 ## 实验内容 ### 任务1:学生信息排序系统 #### 示例数据 ```python students = [ ["张三", "2023001", 85, 92], ["李四", "2023005", 78, 88], ["王五", "2023002", 92, 85], ["赵六", "2023004", 65, 72], ["钱七", "2023003", 88, 90], ["孙八", "2023007", 76, 81], ["周九", "2023006", 95, 93], ["吴十", "2023008", 82, 79], ["郑十一", "2023009", 71, 68], ["王十二", "2023010", 89, 87] ] ``` #### 实现要求 1. 按姓名排序(升序) 2. 按学号排序(升序) 3. 按成绩1排序(降序) 4. 按成绩2排序(降序) #### 参考代码 ```python import operator def sort_students(data, column_index, reverse=False): """对学生数据按指定列排序""" return sorted(data, key=operator.itemgetter(column_index), reverse=reverse) def display_students(students_list, title): """显示学生信息""" print(f"\n{title}") print("-" * 50) print(f"{'姓名':<8} {'学号':<10} {'成绩1':<6} {'成绩2':<6}") for student in students_list: print(f"{student[0]:<8} {student[1]:<10} {student[2]:<6} {student[3]:<6}") # 测试代码 display_students(sort_students(students, 0), "按姓名排序") display_students(sort_students(students, 2, True), "按成绩1降序排序") ``` ### 任务2:新闻信息排序系统 [step 2] #### 示例数据 ```python from datetime import datetime news = [ ["人工智能改变未来", "2024-01-15", 15000, 320], ["气候变化全球会议", "2024-01-10", 8900, 150], ["新款智能手机发布", "2024-01-18", 25600, 480], ["股市大幅波动", "2024-01-12", 12000, 210], ["科技公司财报亮眼", "2024-01-16", 9800, 180], ["体育赛事精彩瞬间", "2024-01-14", 45000, 650], ["教育改革新政策", "2024-01-11", 7600, 95], ["医疗突破新发现", "2024-01-17", 11200, 280], ["旅游行业复苏", "2024-01-13", 6800, 120], ["环保技术创新", "2024-01-19", 5400, 75] ] ``` #### 特别要求 - 按上一个任务仿写代码 - 日期排序需要特殊处理 - 点击量和转发次数按数值大小排序 ``````{only} show_answer ```python def sort_news(data, column_index, reverse=False): """对新闻数据排序,特殊处理日期列""" if column_index == 1: # 日期列 return sorted(data, key=lambda x: datetime.strptime(x[1], "%Y-%m-%d"), reverse=reverse) else: return sorted(data, key=operator.itemgetter(column_index), reverse=reverse) ``` `````` ### 任务3:通用表格排序器类(选做) [step 3] #### 实现要求 创建一个 `TableSorter` 类,模拟图形界面中的表格排序功能: 1. 支持点击不同列排序 2. 点击同一列时切换升序/降序 3. 显示排序状态指示器 #### 参考代码框架 ```python class TableSorter: def __init__(self, data, headers): self.data = data self.headers = headers self.sort_column = None self.sort_order = True # True=升序, False=降序 def sort_by_column(self, column_index): # 实现排序逻辑 pass def display(self): # 实现显示逻辑 pass ```