列表推导式是 Python 中非常强大且灵活的特性之一,它能够让你以一种简洁明了的方式创建列表。本文将从基础到高级逐步介绍列表推导式的使用方法,并通过实际案例帮助你更好地理解和掌握这一技巧。
1. 基本列表推导式
列表推导式的基本语法如下:
new_list = [expression for item in iterable]
这里,expression 是对 item 进行操作的表达式,iterable 是一个可迭代对象,如列表、元组、字符串等。
示例 1:生成一个包含 1 到 10 的平方的列表
squares = [x**2 for x in range(1, 11)]
print(squares) # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2. 带条件的列表推导式
你可以在列表推导式中添加条件语句,以便只对满足特定条件的元素进行操作。
示例 2:生成一个包含 1 到 10 中偶数的平方的列表
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares) # 输出: [4, 16, 36, 64, 100]
3. 多层嵌套的列表推导式
列表推导式可以嵌套使用,这样可以处理更复杂的结构。
示例 3:生成一个二维列表,其中每个子列表包含 1 到 3 的平方
nested_list = [[x**2 for x in range(1, 4)] for _ in range(3)]
print(nested_list) # 输出: [[1, 4, 9], [1, 4, 9], [1, 4, 9]]
4. 使用多个可迭代对象
你可以在列表推导式中使用多个可迭代对象,这在处理多个数据源时非常有用。
示例 4:生成一个列表,包含两个列表中所有可能的组合
list1 = [1, 2, 3]
list2 = ['a', 'b']
combinations = [(x, y) for x in list1 for y in list2]
print(combinations) # 输出: [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]
5. 使用复杂表达式
列表推导式中的表达式可以非常复杂,可以包含函数调用、条件表达式等。
示例 5:生成一个列表,包含字符串列表中每个字符串的长度
words = ["apple", "banana", "cherry"]
lengths = [len(word) for word in words]
print(lengths) # 输出: [5, 6, 6]
6. 高级技巧:使用列表推导式进行数据清洗
列表推导式在数据清洗中也非常有用,可以帮助你快速过滤和转换数据。
示例 6:去除字符串列表中的空字符串
dirty_data = ["apple", "", "banana", "", "cherry"]
clean_data = [word for word in dirty_data if word != ""]
print(clean_data) # 输出: ['apple', 'banana', 'cherry']
7. 实战案例:处理日志文件
假设你有一个日志文件,每行记录了一个用户的访问时间。你想要提取出所有访问时间在上午 9 点到 11 点之间的记录。
日志文件内容(log.txt):
2023-10-01 08:30:00 - User1
2023-10-01 09:15:00 - User2
2023-10-01 10:45:00 - User3
2023-10-01 12:00:00 - User4
代码实现:
# 读取日志文件
with open('log.txt', 'r') as file:
logs = file.readlines()
# 使用列表推导式提取符合条件的记录
filtered_logs = [
log.strip() for log in logs
if '09:' <= log[11:13] < '12:'
]
# 打印结果
for log in filtered_logs:
print(log)
输出:
2023-10-01 09:15:00 - User2
2023-10-01 10:45:00 - User3
总结
本文介绍了 Python 列表推导式的基本用法,包括基本列表推导式、带条件的列表推导式、多层嵌套的列表推导式、使用多个可迭代对象、复杂表达式以及数据清洗中的应用。通过实际案例,展示了如何使用列表推导式处理日志文件中的数据。