程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python自动化办公应用学习笔记20—列表排序、列表推导式

hfteth 2025-08-03 04:57:56 技术文章 4 ℃

一、列表排序:高效整理数据

1. list.sort()方法(原地排序)

  • 定义:直接修改原列表,不返回新列表
  • 语法list.sort(key=None, reverse=False)
  • 适用场景:原数据可修改且需节省内存时
  • 技巧
    • 性能优于sorted()(无需创建新对象)
    • 搭配key参数实现自定义排序规则

files = ["报告2023.docx", "总结2022.xlsx", "数据2024.csv"]

files.sort(key=lambda x: int(x[2:6])) # 按年份升序排序

print(files) # 输出:['总结2022.xlsx', '报告2023.docx', '数据2024.csv']


2. sorted()函数(新建排序列表)

  • 定义:返回新排序列表,原数据不变
  • 语法sorted(iterable, key=None, reverse=False)
  • 适用场景
    • 需保留原始数据
    • 排序非列表对象(如元组、字典键值)

employees = [{"name": "张三", "age": 28}, {"name": "李四", "age": 25}]

sorted_emps = sorted(employees, key=lambda x: x["age"], reverse=True) # 按年龄降序

print(sorted_emps) # [{'name': '张三', 'age': 28}, {'name': '李四', 'age': 25}]

3. 核心参数详解

参数

作用

办公场景案例

key

指定排序依据的函数

key=len 按文件名长度排序

reverse

True降序,False升序(默认)

reverse=True 按文件大小倒序排列

高级用法

# 多级排序:先按部门,再按工资

staff = [

{"dept": "财务", "salary": 8000},

{"dept": "IT", "salary": 9000},

{"dept": "财务", "salary": 7500}

]

staff.sort(key=lambda x: (x["dept"], x["salary"]))


二、列表推导式:高效生成数据

1. 基础语法

  • 定义:单行代码生成新列表
  • 语法[表达式 for 变量 in 可迭代对象]
  • 适用场景:数据转换、过滤

# 生成1-10的平方列表

squares = [x**2 for x in range(1, 11)] # [1, 4, 9, ..., 100]

2. 带条件的推导式

  • 类型
    • 过滤条件[x for x in iterable if 条件]
    • 条件赋值[x if 条件 else y for ...]

# 筛选Excel文件并转小写

all_files = ["data.xlsx", "报告.doc", "预算.xlsx"]

excel_files = [f.lower() for f in all_files if f.endswith(".xlsx")]

# 结果:['data.xlsx', '预算.xlsx']


# 数值分类:大于500标"高",否则标"低"

values = [300, 600, 450]

labels = ["高" if v > 500 else "低" for v in values] # ['低', '高', '低']


3. 嵌套循环推导式

  • 语法[操作 for 子循环1 in A for 子循环2 in B]
  • 场景:多层级数据展开(如Excel多行表处理)

# 二维表格数据扁平化

table_data = [[1, 2], [3, 4]]

flat_data = [num for row in table_data for num in row] # [1, 2, 3, 4]


# 生成文件路径组合(目录+文件名)

folders = ["D:/报告", "E:/数据"]

files = ["2023.txt", "2024.txt"]

paths = [f"{folder}/{file}" for folder in folders for file in files]

# 结果:['D:/报告/2023.txt', 'D:/报告/2024.txt', 'E:/数据/2023.txt', ...]


三、选择指南

场景

推荐方案

原因

修改原列表且节省内存

list.sort()

原地操作,无额外内存开销

保留原数据或排序非列表对象

sorted()

返回新对象不影响原数据

快速生成新列表

列表推导式

代码简洁,执行效率高

复杂逻辑或多步操作

传统for循环

可读性更强

提示

1. 列表推导式中避免嵌套超过两层

2. sort()返回值是None!勿写new_list = old_list.sort()

3. 办公场景优先用sorted()防止误改原始数据

四、实战:处理员工数据

# 原始数据:姓名,部门,工资

raw_data = "张三-IT-8000;李四-财务-7500;王五-IT-9000"


# 1. 分割字符串并结构化

employees = [

{"name": item.split("-")[0],

"dept": item.split("-")[1],

"salary": int(item.split("-")[2])}

for item in raw_data.split(";")

]


# 2. 按部门升序+工资降序排序

employees_sorted = sorted(

employees,

key=lambda x: (x["dept"], -x["salary"]) # 工资降序技巧:取负数

)


# 3. 生成高薪人员名单(>8000)

high_salary_names = [e["name"] for e in employees if e["salary"] > 8000]


print("排序后:", employees_sorted)

print("高薪人员:", high_salary_names)

输出

排序后: [

{'name':'李四', 'dept':'财务', 'salary':7500},

{'name':'王五', 'dept':'IT', 'salary':9000},

{'name':'张三', 'dept':'IT', 'salary':8000}

]

高薪人员: ['王五']

最近发表
标签列表