Lab 1.3 - Python 编程实验指导:2维List高级排序

实验目的

  1. 理解多列排序的原理和实现

  2. 能够将排序技术应用到实际问题中

  3. 了解使用 operator.itemgetter 进行2维列表排序的方法

实验环境

  • Python 3.6+

  • 无需额外安装库

实验原理

1. operator.itemgetter 详解

operator.itemgetter 是一个函数工厂,用于创建提取序列元素的函数:

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:学生信息排序系统

示例数据

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排序(降序)

参考代码

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]

示例数据

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

特别要求

  • 按上一个任务仿写代码

  • 日期排序需要特殊处理

  • 点击量和转发次数按数值大小排序

任务3:通用表格排序器类(选做)

[step 3]

实现要求

创建一个 TableSorter 类,模拟图形界面中的表格排序功能:

  1. 支持点击不同列排序

  2. 点击同一列时切换升序/降序

  3. 显示排序状态指示器

参考代码框架

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