Python 列表推导式

列表推导式提供了一种简洁的方式,基于现有列表的值来创建一个新列表。

假设我们有一个数字列表,并且我们希望创建一个新列表,其中包含列表中每个元素的双倍值。

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]

列表推导式的工作原理如下:

Python List Comprehension
Python 列表推导式


列表推导式语法

[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 与列表推导式

让我们使用 `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

让我们使用带列表推导式的嵌套 `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]

在这里,列表推导式检查两个条件:

  1. y 是否能被 2 整除。
  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]]

嵌套列表推导式的工作原理如下:

Nested Loop in List Comprehension
列表推导式中的嵌套循环

让我们看看使用嵌套 `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` 循环生成与嵌套列表推导式相同的输出。我们可以看到,使用列表推导式的代码更简洁明了。

列表推导式 vs. Lambda 函数

除了列表推导式,我们还使用 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 函数用法的更多信息。

视频:Python 列表、集合和字典推导式

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战