Skip to main content

Python 基础

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}