列表推导式是 Python 中用于创建列表的一种简洁而优雅的方法。通过列表推导式,可以从一个或多个可迭代对象(如列表、元组、字符串、集合等)中生成一个新的列表,同时可以在生成过程中对元素进行过滤和转换。列表推导式不仅能使代码更加简洁,还能提升可读性和执行效率。
基本语法
列表推导式的基本语法如下:
[表达式 for 元素 in 可迭代对象 if 条件]
- 表达式:它是你希望对每个元素进行的操作或转换。
- 元素:表示当前循环到的元素。
- 可迭代对象:你要遍历的对象,比如列表、元组、字符串等。
- 条件(可选):一个过滤条件,只有满足条件的元素才会被包含在生成的列表中。
基础实例
以下是一些列表推导式示例。
生成平方数列表
实例
squares = [x**2 for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
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]
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']
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)]
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]
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]
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']
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]
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]
return x**2
squares = [square(x) for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6. 注意事项
- 可读性:虽然列表推导式可以使代码更加简洁,但过于复杂的列表推导式会影响可读性。在这种情况下,使用普通的循环可能更好。
- 性能:列表推导式在大多数情况下都比普通的循环更高效,但在处理非常大的数据集时,生成器表达式可能是更好的选择,因为它们不会一次性生成整个列表,而是按需生成元素。
点我分享笔记