列表推导式提供了一种简洁的方式,基于现有列表的值来创建一个新列表。
假设我们有一个数字列表,并且我们希望创建一个新列表,其中包含列表中每个元素的双倍值。
numbers = [1, 2, 3, 4]
# list comprehension to create new list
doubled_numbers = [num * 2 for num in numbers]
print(doubled_numbers)
输出
[2, 4, 6, 8]
列表推导式的工作原理如下:

列表推导式语法
[expression for item in list if condition == True]
这里,
对于 `list` 中的每个 `item`,如果 `condition` 为 `True`,则执行 `expression`。
注意:列表推导式中的 `if` 语句是可选的。
for 循环 vs. 列表推导式
列表推导式使代码比 `for` 循环更简洁。
让我们编写一个程序,使用 `for` 循环和列表推导式打印每个列表元素的平方。
for 循环
numbers = [1, 2, 3, 4, 5]
square_numbers = []
# for loop to square each elements
for num in numbers:
square_numbers.append(num * num)
print(square_numbers)
# Output: [1, 4, 9, 16, 25]
列表推导式
numbers = [1, 2, 3, 4, 5]
# create a new list using list comprehension
square_numbers = [num * num for num in numbers]
print(square_numbers)
# Output: [1, 4, 9, 16, 25]
一旦你了解了 Python for 循环(),理解列表推导式就会容易得多。
列表推导式中的条件语句
列表推导式可以利用条件语句,如 if…else 来过滤现有列表。
让我们看一个带有列表推导式的 `if` 语句示例。
# filtering even numbers from a list
even_numbers = [num for num in range(1, 10) if num % 2 == 0 ]
print(even_numbers)
# Output: [2, 4, 6, 8]
在这里,列表推导式检查 `range(1, 10)` 中的数字是偶数还是奇数。如果是偶数,则将该数字添加到列表中。
注意:`range()` 函数生成一个数字序列。要了解更多信息,请访问 Python range()。
让我们使用 `if...else` 和列表推导式来查找偶数和奇数。
numbers = [1, 2, 3, 4, 5, 6]
# find even and odd numbers
even_odd_list = ["Even" if i % 2 == 0 else "Odd" for i in numbers]
print(even_odd_list)
输出
['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even']
在这里,如果 numbers 列表中的一个项目能被 2 整除,它会将 `Even` 附加到 even_odd_list 列表中。否则,它会附加 `Odd`。
让我们使用带列表推导式的嵌套 `if` 来查找能被 5 整除的偶数。
# find even numbers that are divisible by 5
num_list = [y for y in range(100) if y % 2 == 0 if y % 5 == 0]
print(num_list)
输出
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
在这里,列表推导式检查两个条件:
- y 是否能被 2 整除。
- 如果可以,y 是否能被 5 整除。
如果 y 满足这两个条件,则将该数字添加到 num_list 中。
示例:带字符串的列表推导式
我们还可以将列表推导式与其他可迭代对象(除了列表)一起使用。
word = "Python"
vowels = "aeiou"
# find vowel in the string "Python"
result = [char for char in word if char in vowels]
print(result)
# Output: ['o']
在这里,我们使用列表推导式在字符串 `'Python'` 中查找元音。
更多关于 Python 列表推导式
我们还可以在列表推导式中使用嵌套循环。让我们编写代码来计算乘法表。
multiplication = [[i * j for j in range(1, 6)] for i in range(2, 5)]
print(multiplication)
输出
[[2, 4, 6, 8, 10], [3, 6, 9, 12, 15], [4, 8, 12, 16, 20]]
嵌套列表推导式的工作原理如下:

让我们看看使用嵌套 `for` 循环的等效代码。
等效的嵌套 for 循环
multiplication = []
for i in range(2, 5):
row = []
for j in range(1, 6):
row.append(i * j)
multiplication.append(row)
print(multiplication)
在这里,嵌套的 `for` 循环生成与嵌套列表推导式相同的输出。我们可以看到,使用列表推导式的代码更简洁明了。
除了列表推导式,我们还使用 lambda 函数来处理列表。
虽然列表推导式通常用于根据某些条件过滤列表,但 lambda 函数通常与 `map()` 和 `filter()` 等函数一起使用。
它们用于复杂的操作或需要匿名函数时。
让我们看一个例子。
numbers = [5, 6, 7, 8, 9]
# create a new list using a lambda function
square_numbers = list(map(lambda num : num**2 , numbers))
print(square_numbers)
输出
[25, 36, 49, 64, 81]
我们可以通过列表推导式实现相同的结果:
# create a new list using list comprehension
square_numbers = [num ** 2 for num in numbers]
如果比较这两个代码,列表推导式更直接、更易于阅读和理解。
因此,除非需要执行复杂操作,否则我们可以坚持使用列表推导式。
访问 Python Lambda/函数 以了解有关 Python 中 lambda 函数用法的更多信息。