Python列表生成式
Python 的 列表生成式(List Comprehension) 是一种简洁高效的创建列表的方式,可以用一行代码替代多行循环逻辑。
传统的循环的写法
# 循环遍历列表中的每个元素,并将其平方后添加到新的列表中
original = [0, 1, 2, 3, 4]
squares = []
for num in original:
squares.append(num ** 2)
print(squares) # 输出: [0, 1, 4, 9, 16]
使用range() 函数产生整数序列可以简化上面的写法。
squares = []
for x in range(5):
squares.append(x**2)
使用列表表达式则可以简化为一行
squares = [x**2 for x in range(5)]
基本语法
[expression for item in iterable]
expression
: 对每个元素的处理表达式item
: 迭代变量iterable
: 可迭代对象(如列表、字符串、range等)
示例分类
1. 简单生成
生成一个数字平方的列表:
squares = [x**2 for x in range(5)]
# 输出: [0, 1, 4, 9, 16]
2. 带条件筛选
仅保留偶数平方:
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# 输出: [0, 4, 16, 36, 64]
3. 双重循环
生成两个列表的笛卡尔积:
pairs = [(x, y) for x in [1, 2] for y in ['a', 'b']]
# 输出: [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
4. 嵌套列表生成式
矩阵转置(行列互换):
matrix = [[1, 2, 3], [4, 5, 6]]
transposed = [[row[i] for row in matrix] for i in range(3)]
# 输出: [[1, 4], [2, 5], [3, 6]]
5. 字符串处理
将句子拆分为单词并转为大写:
sentence = "hello world"
upper_words = [word.upper() for word in sentence.split()]
# 输出: ['HELLO', 'WORLD']
6. 条件表达式(三元操作符)
根据数字奇偶性标记:
labels = ["Even" if x % 2 == 0 else "Odd" for x in range(4)]
# 输出: ['Even', 'Odd', 'Even', 'Odd']
7. 字典数据提取
提取字典中的特定键值:
users = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]
names = [user['name'] for user in users]
# 输出: ['Alice', 'Bob']
与传统循环对比
普通循环写法:
squares = []
for x in range(5):
squares.append(x**2)
列表生成式写法:
优势与注意事项
- 优势:代码简洁、执行效率通常更高
- 注意:避免过度复杂的嵌套,确保可读性