在Python中,推导式(Comprehension)是一种简洁、高效的方式来创建列表(list)、集合(set)、字典(dict)和元组(tuple)等数据结构。推导式允许你在一行代码中创建这些数据结构,通过迭代一个或多个可迭代对象并应用某种函数或表达式。
一、列表推导式(List Comprehension)
格式:
- 不带条件的列表推导式:
[expression for item in iterable]
- 带条件的列表推导式:
[expression for item in iterable if condition]
示例:
- 不带条件的列表推导式:
# 创建一个包含0到4的平方的列表
squares = [x**2 for x in range(5)]
print(squares) # 输出: [0, 1, 4, 9, 16]
# 创建一个包含列表中每个元素字符串形式的列表
words = ['apple', 'banana', 'cherry']
word_lengths = [len(word) for word in words]
print(word_lengths) # 输出: [5, 6, 6]
- 带条件的列表推导式:
# 创建一个包含0到9中偶数的平方的列表
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # 输出: [0, 4, 16, 36, 64]
# 创建一个包含列表中所有偶数(字符串形式)的列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers_str = [str(num) for num in numbers if num % 2 == 0]
print(even_numbers_str) # 输出: ['2', '4', '6', '8']
嵌套列表推导式:
嵌套列表推导式用于处理嵌套的可迭代对象,如列表的列表。
# 创建一个二维列表的扁平化列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [element for row in matrix for element in row]
print(flattened) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推导式是 Python 中非常强大和灵活的特性,它允许你以简洁、易读的方式创建和操作列表。
当涉及到字典、集合和元组的推导式时,它们的语法与列表推导式相似,但有一些关键的区别。下面我将详细解释每种推导式的格式和示例。
二、字典推导式(Dict Comprehension)
字典推导式用于从可迭代对象(如列表、元组或另一个字典)中创建新的字典。
格式:
{key_expr: value_expr for item in iterable if condition}
示例:
# 从列表的元组中创建字典
items = [(1, 'apple'), (2, 'banana'), (3, 'cherry')]
fruit_dict = {k: v for k, v in items}
print(fruit_dict) # 输出: {1: 'apple', 2: 'banana', 3: 'cherry'}
# 创建一个字典,其中键是0到4的数字,值是它们的平方(仅包含偶数键)
squares_dict = {i: i**2 for i in range(5) if i % 2 == 0}
print(squares_dict) # 输出: {0: 0, 2: 4, 4: 16}
三、集合推导式(Set Comprehension)
集合推导式用于从可迭代对象中创建新的集合。集合中的元素是不重复的。
格式:
{expr for item in iterable if condition}
示例:
# 创建一个集合,包含0到9的平方(去重后)
squares_set = {x**2 for x in range(10)}
print(squares_set) # 输出可能是: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}(但顺序可能不同)
# 创建一个集合,包含列表中所有的偶数
numbers = [1, 2, 2, 3, 4, 4, 5]
even_numbers_set = {x for x in numbers if x % 2 == 0}
print(even_numbers_set) # 输出可能是: {2, 4}(但顺序可能不同)
四、元组推导式(实际上没有直接的元组推导式)
Python 没有直接的元组推导式语法,但可以使用生成器表达式和 tuple()
函数来间接地创建一个元组。
示例(使用生成器表达式和 tuple()
):
# 创建一个包含0到4的平方的元组
squares_tuple = tuple(x**2 for x in range(5))
print(squares_tuple) # 输出: (0, 1, 4, 9, 16)
# 创建一个包含列表中所有偶数的元组
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers_tuple = tuple(x for x in numbers if x % 2 == 0)
print(even_numbers_tuple) # 输出: (2, 4, 6, 8)
虽然这里使用了圆括号 ()
,但它们实际上是 tuple()
函数的调用语法,而不是元组推导式的语法。记住,圆括号在这里只是为了调用函数,而不是定义推导式。