Python 列表生成式
列表生成式(List Comprehension)是 Python 内置的非常简单却强大的可以用来创建 list 的生成式。 它将循环和条件逻辑压缩为一行代码,提高代码可读性和效率,但是太复杂的列表生成不能过度使用,这样反而会降低可读性。列表生成式适合处理简单的数据转换和过滤任务。
基本语法
列表生成式的基本结构为:
[expression for item in iterable]
expression
:对每个元素进行的操作。item
:迭代变量,代表可迭代对象中的每个元素。iterable
:可迭代对象,如列表、字符串、range 或元组等。
示例:创建平方数列表
squares = [x**2 for x in range(5)]
print(squares) # 输出: [0, 1, 4, 9, 16]
此代码遍历 range(5)
,计算每个数字的平方,生成新列表。
添加条件逻辑
列表生成式支持在迭代时添加条件,语法为:
[expression for item in iterable if condition]
condition
:筛选条件,只有满足条件的元素才会被处理。
示例:筛选偶数
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # 输出: [0, 2, 4, 6, 8]
此代码从 range(10)
中筛选出偶数,生成新列表。
嵌套循环
列表生成式可以处理嵌套循环,适合生成复杂列表。语法为:
[expression for item1 in iterable1 for item2 in iterable2]
示例:生成笛卡尔积
pairs = [(x, y) for x in [1, 2] for y in [3, 4]]
print(pairs) # 输出: [(1, 3), (1, 4), (2, 3), (2, 4)]
此代码遍历两个列表,生成所有可能的元素对。
使用条件表达式
列表生成式支持条件表达式(三元运算符),语法为:
[value_if_true if condition else value_if_false for item in iterable]
示例:分类数字
labels = ['even' if x % 2 == 0 else 'odd' for x in range(5)]
print(labels) # 输出: ['even', 'odd', 'even', 'odd', 'even']
此代码根据数字的奇偶性生成对应的标签。
嵌套列表生成式
列表生成式可以嵌套,用于处理复杂数据结构,如矩阵转置。
示例:矩阵转置
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transposed = [[matrix[j][i] for j in range(len(matrix))] for i in range(len(matrix[0]))]
print(transposed) # 输出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
此代码将矩阵的行和列互换。
实际应用场景
扁平化嵌套列表:将嵌套列表展开为单一列表。
nested = [[1, 2], [3, 4], [5, 6]]
flattened = [item for sublist in nested for item in sublist]
print(flattened) # 输出: [1, 2, 3, 4, 5, 6]
数据转换:对数据进行统一处理,如字符串格式化。
words = ['apple', 'banana', 'cherry']
uppercase = [word.upper() for word in words]
print(uppercase) # 输出: ['APPLE', 'BANANA', 'CHERRY']
数据过滤:从大型数据集中提取符合条件的元素。
numbers = [1, -2, 3, -4, 5]
positives = [x for x in numbers if x > 0]
print(positives) # 输出: [1, 3, 5]
注意事项
- 可读性:列表生成式适合简单逻辑,过于复杂的逻辑应使用传统循环以提高代码清晰度。
- 性能:列表生成式通常比等效的
for
循环更快,但会一次性生成整个列表,占用内存。
列表生成式 仅用于创建列表,无法直接生成其他数据结构(如字典或集合),但可通过类型转换实现。
numbers = [1, 2, 2, 3]
unique = set([x for x in numbers])
print(unique) # 输出: {1, 2, 3}