Python 简明教程

Python - List Comprehension

List Comprehension in Python

list comprehension 是一种创建列表的简洁方法。它类似于数学中的集合生成器符号。它用于基于现有的可迭代对象(例如列表、元组或字符串)定义 list ,并对可迭代对象中的每个元素应用一个表达式。

Syntax of Python List Comprehension

列表解析的基本语法如下:

new_list = [expression for item in iterable if condition]

其中,

  1. expression 是可迭代对象中每个元素要应用的操作或转换。

  2. item 是可迭代对象中每个元素的表示变量。

  3. iterable 是要遍历的元素序列。

  4. condition (optional) 是根据指定条件过滤元素的表达式。

Example of Python List Comprehension

假设我们要将字符串 “hello world” 中的所有字母转换为大写形式。使用列表解析,我们将遍历每个字符,检查它是否为字母,如果是,则将其转换为大写,从而生成一个大写字母列表:

string = "hello world"
uppercase_letters = [char.upper() for char in string if char.isalpha()]
print(uppercase_letters)

获得的结果显示如下:

['H', 'E', 'L', 'L', 'O', 'W', 'O', 'R', 'L', 'D']

List Comprehensions and Lambda

在 Python 中, lambda 是用于创建匿名函数的关键字。匿名函数是没有名字的定义的函数。这些函数使用 lambda 关键字创建,后面跟着逗号分隔的参数列表,然后是 : ,接着是要计算的表达式。

我们可以在解析中通过对解析中可迭代对象的每个元素应用 lambda 函数来使用具有 lambda 的列表解析,从而生成一个新列表。

Example

在以下示例中,我们使用带有 lambda 函数的列表解析来将给定列表 “original_list” 中的每个元素加倍。我们遍历 “original_list” 中的每个元素,并应用 lambda 函数进行加倍:

original_list = [1, 2, 3, 4, 5]
doubled_list = [(lambda x: x * 2)(x) for x in original_list]
print(doubled_list)

以下是上面代码的输出: -

[2, 4, 6, 8, 10]

Nested Loops in Python List Comprehension

Python 中的嵌套循环是另一个循环中的循环,其中对于外层循环的每次迭代,内层循环都会执行多次。

我们可以在列表解析中通过将一个循环放在另一个循环中来使用嵌套循环,从而简洁地从多次迭代中创建列表。

Example

在此示例中,来自两个列表中的所有项目组合以元组形式添加到第三个列表对象中:

list1=[1,2,3]
list2=[4,5,6]
CombLst=[(x,y) for x in list1 for y in list2]
print (CombLst)

它将生成如下输出:

[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

Conditionals in Python List Comprehension

Python 中的条件是指使用 “if”、“elif”和 “else” 等语句来根据某些条件控制代码流。它们允许你根据条件是计算为 “True” 还是 “False” 来执行不同的代码块。

我们可以在列表解析中通过在可迭代对象之后和循环之前包含它们来使用条件,这将在生成列表时根据指定条件从可迭代对象中筛选元素。

Example

以下示例在列表解析中使用条件来生成一个从 1 到 20 的偶数列表:

list1=[x for x in range(1,21) if x%2==0]
print (list1)

我们得到了如下输出 −

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

List Comprehensions vs For Loop

列表解析和 for 循环都用于迭代,但它们在语法和用法上有所不同。

列表解析类似于 Python 中创建列表的快捷方式。它们允许你通过对现有列表中的每个元素应用操作来生成一个新列表。

另一方面,for 循环是一种控制流语句,用来逐步迭代可迭代元素,为每个元素执行代码块。

Example Using For Loop

假设我们要分离字符串中的每个字母,并将所有非元音字母放入列表对象中。我们可以通过如下所示的 for 循环来做到这一点:

chars=[]
for ch in 'TutorialsPoint':
   if ch not in 'aeiou':
      chars.append(ch)
print (chars)

chars 列表对象显示如下:

['T', 't', 'r', 'l', 's', 'P', 'n', 't']

Example Using List Comprehension

我们可以通过列表解析技术轻松获得相同的结果。列表解析的常规用法如下:

listObj = [x for x in iterable]

应用此规则,chars 列表可通过以下语句构造:

chars = [ char for char in 'TutorialsPoint' if char not in 'aeiou']
print (chars)

chars 列表将像以前一样显示:

['T', 't', 'r', 'l', 's', 'P', 'n', 't']

Example

以下示例使用列表解析来构建 1 到 10 之间数字的平方列表:

squares = [x*x for x in range(1,11)]
print (squares)

squares 列表对象为:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Advantages of List Comprehension

以下是使用列表解析的优点:

  1. Conciseness − 与传统的 for 循环相比,列表解析更加简洁且易读,它允许你使用更少的代码创建列表。

  2. Efficiency − 列表解析通常比 for 循环更快更高效,因为它们在内部由 Python 解释器进行了优化。

  3. Clarity − 列表解析生成更清晰、更具表现力的代码,更易于理解正在执行的操作的目的和逻辑。

  4. Reduced Chance of Errors − 由于列表解析更紧凑,与传统的 for 循环相比,出错的可能性更小,从而降低了代码中出现错误的可能性。