列表推导式是 Python 中用于创建列表的一种简洁而优雅的方法。通过列表推导式,可以从一个或多个可迭代对象(如列表、元组、字符串、集合等)中生成一个新的列表,同时可以在生成过程中对元素进行过滤和转换。列表推导式不仅能使代码更加简洁,还能提升可读性和执行效率。

基本语法

列表推导式的基本语法如下:

[表达式 for 元素 in 可迭代对象 if 条件]
  • 表达式:它是你希望对每个元素进行的操作或转换。
  • 元素:表示当前循环到的元素。
  • 可迭代对象:你要遍历的对象,比如列表、元组、字符串等。
  • 条件(可选):一个过滤条件,只有满足条件的元素才会被包含在生成的列表中。

基础实例

以下是一些列表推导式示例。

生成平方数列表

实例

squares = [x**2 for x in range(10)]
print(squares)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

生成偶数列表

实例

evens = [x for x in range(20) if x % 2 == 0]
print(evens)  # 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

生成字符串中每个字符的大写形式:

实例

uppercase_chars = [char.upper() for char in 'hello']
print(uppercase_chars)  # 输出: ['H', 'E', 'L', 'L', 'O']

3. 嵌套循环

列表推导式也可以包含嵌套循环,以处理多维数据结构或生成组合。例如:

实例

cartesian_product = [(x, y) for x in range(3) for y in range(3)]
print(cartesian_product)  # 输出: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

处理矩阵

实例

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flatten = [elem for row in matrix for elem in row]
print(flatten)  # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

4. 条件过滤

你可以在列表推导式中添加条件,以过滤掉不满足条件的元素。

过滤负数

实例

numbers = [-5, -3, -1, 0, 2, 4, 6]
positive_numbers = [x for x in numbers if x >= 0]
print(positive_numbers)  # 输出: [0, 2, 4, 6]

过滤并转换

实例

words = ['apple', 'banana', 'cherry', 'date']
capitalized_words = [word.capitalize() for word in words if len(word) > 5]
print(capitalized_words)  # 输出: ['Banana', 'Cherry']

5. 复杂表达式

列表推导式不仅限于简单的表达式和条件,你可以在表达式中进行更复杂的操作:

多条件过滤和转换

实例

numbers = range(10)
result = [x**2 if x % 2 == 0 else x**3 for x in numbers if x > 0]
print(result)  # 输出: [1, 4, 27, 16, 125, 36, 343, 64, 729]

使用函数

实例

def square(x):
    return x**2

squares = [square(x) for x in range(10)]
print(squares)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

6. 注意事项

  • 可读性:虽然列表推导式可以使代码更加简洁,但过于复杂的列表推导式会影响可读性。在这种情况下,使用普通的循环可能更好。
  • 性能:列表推导式在大多数情况下都比普通的循环更高效,但在处理非常大的数据集时,生成器表达式可能是更好的选择,因为它们不会一次性生成整个列表,而是按需生成元素。