Python 中的列表理解 – 示例

使用Python列表推导式创建列表

在Python编程中,列表推导式是一种强大的工具,它可以帮助我们从现有的可迭代对象(例如列表、字符串和元组)高效地创建新的列表。列表推导式的简洁语法使得我们仅需一行代码即可完成新列表的构建。本教程将引导您深入了解如何利用列表推导式来完成这项任务。

在接下来的内容中,您将学习到:

  • 如何利用for循环来创建新的列表。
  • Python中列表推导式的基本语法结构。
  • 如何运用if条件语句来进一步修改列表推导式的行为。

此外,我们还将通过几个实际的例子来加深您对列表推导式的理解。让我们开始这段探索之旅吧!

如何使用for循环创建Python列表

假设您有一个名为nums的数字列表,并且您想创建一个新的列表,其中包含nums中每个数字的立方值。以下是使用for循环实现这一目标的方法:

    
      nums = [2,3,5,7]
      num_cubes = []
      for num in nums:
        num_cubes.append(num**3)

      print(num_cubes)
      # 输出
      [8, 27, 125, 343]
    
  

上述代码的执行步骤如下:

  • 首先,初始化一个空的列表num_cubes
  • 然后,遍历nums列表中的每一个元素。
  • 对于遍历到的每一个数字num,计算其立方值(num**3)。
  • 最后,将计算出的立方值添加到列表num_cubes中。

请注意:在Python中,幂运算符**用于计算一个数的幂,其语法形式为num**pow,表示将数字num提升到pow次幂。

然而,使用Python中的列表推导式,我们可以以更加简洁和高效的方式完成同样的操作。让我们继续深入学习其语法。

Python列表推导式语法

列表推导式的一般语法结构如下:

    
      <新列表> = [<表达式> for <项> in <可迭代对象>]
    
  

接下来,我们来详细解读一下这个语法:

  • 在Python中,列表通常用方括号[]来表示,因此列表推导式也需要被包含在方括号内。
  • <项> in <可迭代对象>表示您正在遍历一个可迭代对象。 任何可以被循环访问并逐个获取其中元素的Python对象(例如列表、元组和字符串)都被认为是可迭代的。
  • <表达式>表示您希望为可迭代对象中的每个<项>计算的输出结果。

听起来是不是很简单?

本质上,您希望对列表(或任何可迭代对象)中的每个项目执行某种操作,从而得到一个新的列表。

为了更加直观地理解,我们可以将其简化为下图所示。

Python列表推导式语法(图片来源:作者)

现在您已经掌握了基本语法,是时候开始实践了。您可以使用像techblik.com这样的在线Python IDE来运行这些示例。或者,您也可以在您的本地计算机上执行它们。

Python列表推导式示例

在前面的章节中,我们使用for循环从nums列表创建了一个新的列表num_cubes。 现在,让我们使用列表推导式来重写它。

使用列表推导式处理数字

让我们应用以下简化后的语法:

  • <要执行的操作>:在这里,我们想要计算每个数字num的立方值。因此,用num**3来替换<要执行的操作>
  • <每一个元素>:循环变量是num,代表列表中的每个数字。
  • <现有列表>:我们现有的列表是nums
  • 所以,[num**3 for num in nums]是最终的表达式。 ✅

总而言之,我们得到以下代码片段:

    
      num_cubes = [num**3 for num in nums]
      print(num_cubes)

      # 输出
      [8, 27, 125, 343]
    
  

恭喜您,您已经成功编写了您的第一个列表推导式。🎉

接下来,让我们继续学习如何使用列表推导式处理字符串。

使用列表推导式处理字符串

假设您有一个作者列表。您可以根据自己的喜好重写下面的列表。😄

      
       authors = ["jane austen","george orwell","james clear","cal newport"]
      
    

请注意,上面的列表中作者的名字都是小写的。现在,我们希望将它们格式化为标题大小写,并将结果存储在一个名为author_list的新列表中。

注意:在Python中,字符串方法title()接受一个字符串作为参数,并返回一个格式化为标题大小写的字符串副本。也就是说,每个单词的首字母都会大写:First-name Last-name

因此,您需要执行以下操作:

  • 遍历authors列表中的每个作者。
  • 调用author.title()以获取该字符串的标题大小写副本。

相应的Python代码如下所示:

    
      authors = ["jane austen","george orwell","james clear","cal newport"]

      author_list = [author.title() for author in authors]
      print(author_list)

      # 输出
      ['Jane Austen', 'George Orwell', 'James Clear', 'Cal Newport']
    
  

在上面的输出中,我们可以看到所有作者的姓名都已格式化为标题大小写,这正是我们所期望的。

使用列表推导式处理多个列表

到目前为止,您已经学习了如何使用列表推导式从一个现有的列表创建一个新的列表。现在,让我们学习如何从多个列表创建一个新的列表。

例如,考虑这样一个问题:您有两个列表l_arrb_arr,分别包含4个矩形的长度和宽度。

您需要创建一个新的列表area,其中包含这4个矩形的面积。请记住,面积=长*宽。

      
        l_arr = [4,5,1,3]
        b_arr = [2,1,7,9]
      
    

您需要同时使用两个列表(l_arrb_arr)中的元素来计算面积。您可以使用Python的zip()函数来实现。

注意:在Python中,zip()函数可以接受一个或多个可迭代对象作为参数,其语法为zip(*iterables)。它会返回一个元组迭代器,其中第i个元组包含来自每个可迭代对象的第i个元素。

下图详细地描述了这一点。 l_arrb_arr中都有4个值,因此索引的范围是从0到3。我们可以看到,第0个元组包含l_arr[0]b_arr[0],第1个元组包含l_arr[1]b_arr[1],以此类推。

Python zip() 函数(图片来源:作者)

因此,您可以遍历zip(l_arr, b_arr),如下所示:

    
      area = [l*b for l,b in zip(l_arr,b_arr)]
      print(area)

      # 输出
      [8,5,7,27]
    
  

在下一节中,您将学习如何在列表推导式中使用条件语句。

使用条件语句的Python列表推导式

让我们从之前的列表推导式语法开始。

这是其语法:

    
      <新列表> = [<表达式> for <项> in <可迭代对象> if <条件>]
    
  

您可能并不想为所有项目计算<表达式>,而只想对那些满足特定<条件>的项目执行此操作——其中,条件 := True。 这就引出了一个简化后的语法,如下所示:

使用条件语句的Python列表推导式(图片来源:作者)

▶ 接下来,让我们来看一些代码示例。

使用条件语句的Python列表推导式示例

#1. 给定一个字符串“我在 2022 年学习 Python”。 你想获取此字符串中所有数字的列表。 你该如何实现?

在Python中,<字符>.isdigit()函数会对字符<字符>进行判断,如果该字符是数字 (0-9),则返回True,否则返回False

下面的代码片段展示了如何收集字符串str1中所有数字的列表。

    
      str1 = "I'm learning Python3 in 2022"

      digits = [char for char in str1 if char.isdigit()]

      print(digits)

      # 输出
      ['3', '2', '0', '2', '2']
    
  

在上述代码中:

  • 您遍历了字符串str1
  • 使用isdigit()方法访问每个字符以检查它是否为数字。
  • 只有当字符是一个数字时,才将其添加到新的列表digits中。

让我们再看一个例子。

#2. 您有一个水果列表。🍊 您想创建一个列表starts_with_b,其中包含水果列表中以字母“b”开头的所有水果。 您可以使用startswith()方法来编写条件。

如果<字符串>以字符“char”开头,则<字符串>.startswith('char')会返回True,否则返回False

    
        fruits = ['blueberry','apple','banana','orange','cherry']

        starts_with_b = [fruit for fruit in fruits if fruit.startswith('b')]

        print(starts_with_b)

        # 输出
        ['blueberry', 'banana']
    
  

在上面的输出中,我们得到了“blueberry”和“banana”,它们是水果列表中以“b”开头的两种水果,这正是我们所预期的。

至此,我们关于列表推导式的讨论就告一段落了。

总结

希望本教程能够帮助您理解Python中的列表推导式。

让我们总结一下:

  • 您可以使用[<要执行的操作> for <每一个元素> in <现有列表>]的语法,利用列表推导式创建一个新的列表。
  • 此外,您还可以使用[<要执行的操作> for <每一个元素> in <现有列表> if <条件为True>]语法,结合if条件语句来实现更复杂的操作。

此外,您还学习了多个实际的例子。 作为下一步,您可以尝试使用列表推导式来重写一些现有的Python循环,从而创建新的列表。祝您编程愉快! 期待在下一个教程中与您相见。😄

接下来,您可以学习如何将列表转换为字典,或者探索如何在Python中处理文件。