📜  Python中的列表理解list comprehension

📅  最后修改于: 2020-08-31 13:24:49             🧑  作者: Mango

列表是Python中的基本数据类型之一。每次遇到一个变量名,后跟一个方括号[]或一个list构造函数,它就是一个能够包含多个项目的列表,使其成为复合数据类型。同样,声明新列表并随后向其中添加一个或多个项目也很容易。

让我们创建一个新的填充列表,例如:

>>> new_list = [1, 2, 3, 4, 5]
>>> new_list
[1, 2, 3, 4, 5]

或者我们可以简单地使用append()方法将所需的任何内容添加到列表中:

>>> new_list.append(6)
>>> new_list
[1, 2, 3, 4, 5, 6]

如果您需要将多个项目附加到同一列表中,该extend()方法将派上用场。您只需要传递要附加到该extend方法的项目列表,如下所示:

>>> new_list.extend([7, 8, 9])
>>> new_list
[1, 2, 3, 4, 5, 6, 7, 8, 9]

如您所见,创建列表并将其附加到其他项目只是小菜一碟。您可以完成此任务,而不必多次调用该.append()方法。

同样,您可以使用for循环将多个项目附加到列表中。例如,我们将必须编写以下代码来为整数1-20创建一个正方形列表。

list_a = []
for i in range(1, 20):
    list_a.append(i**2)

什么是Python中的列表推导?

简单来说,列表理解是从现有列表创建新列表的过程。或者,您可以说这是Python将for循环附加到列表的独特方法。但是,声明一个列表并将您喜欢的任何内容附加到它已经很简单了。是不是 那么,为什么还要去理解我们的清单呢?

实际上,列表理解比传统列表具有许多优势。首先,代码仅跨越一行,这使得声明和读取更加容易。理解列表也比使用for循环声明一个新列表要麻烦。最后,它还是生成新的填充列表的便捷,快捷和直观的方式。

回到整数1到20的平方,我们可以使用列表理解方法获得相同的结果。这是我们的代码现在的样子:

list_b = [i**2 for i in range(1, 20)]

请注意,用于生成列表项的逻辑是如何用括号括起来的。在下一节中,我们将详细介绍语法。

列表推导的语法

在继续前进之前,必须解释列表理解的语法。这是包含条件的列表理解的基本语法: 

[expression for item in list if conditional]

表达式循环之前似乎有些倒退,但这是这样做的。这种顺序大概是这样的,因为如果没有某种类型的分号(Python没有这种类型的分号),很难将表达式放在条件之后

您可能已经猜到了,“表达式”实际上是当我们执行列表推导中的其余代码时得到的输出。代码本身只是用于循环访问数据集合的for循环。在我们的示例中,我们使用表达式或输出来生成正方形列表。

请注意,条件是可选的,因此就像在上面的示例中一样,我们不需要将其包括在内。

还值得一提的是,我们有一个要循环的列表,一个或多个要迭代的项目,当然还有列表理解和传统for循环中的条件语句。因此,每种方法都具有相同的一般构造,但是不同之处在于您格式化和组织它们的方式。

我们还将看另一个更复杂的示例,以进一步理解列表理解背后的概念。

list_a = [1, 3, 6, 9, 12, 15]
list_b = []
for number in list_a:
    if number % 4 == 0:
        list_b.append(number)

print(list_b)

实际上,我们list_a在上面的示例中遍历了。随后,list_b如果项的值可被4整除,则将其附加到项,然后使用模运算符(%)对其进行检查。在此示例中,我们将看到以下内容打印到控制台:

[12]

这是因为12是该数组中唯一可被4整除的数字。

再一次,我们可以使用列表理解来减少为达到相同目标而必须编写的总代码行。

如上所述,for以上语句中的循环遍历了名为的列表list_a。然后,它执行条件语句,该语句检查当前值是否可以被4整除。最后,.append()当确定该值实际上可以被4整除时,它执行该方法。

现在,如果您想用列表理解来编写上面的代码,看起来应该像这样:

list_a = [1, 3, 6, 9, 12, 15]
list_b = [number for number in list_a if number % 4 == 0]

print(list_b)

如您所见,我们for将跨越三行的循环减少到仅一行。实际上,这就是列表理解的真正美。

何时使用列表推导

在很多情况下,您需要使用列表推导,而您需要根据迭代器生成列表。但是,使用此方法的最佳时间是当您需要根据设置的模式一致地向列表中添加或提取项目时。Python开发人员大多使用它们从通常很大的项目集中提取数据。

让我们假设您有一个成千上万的当前和以前的学生名单,包括他们的名字,他们父亲的名字和地址。每个学生的数据还存储在相应的词典中。但是,如果您只想打印他们的名字怎么办?

students = [
    {
        "name" : "Jacob Martin",
        "father name" : "Ros Martin",
        "Address" : "123 Hill Street",
    }, {
        "name" : "Angela Stevens",
        "father name" : "Robert Stevens",
        "Address" : "3 Upper Street London",
    }, {
        "name" : "Ricky Smart",
        "father name" : "William Smart",
        "Address" : "Unknown",
    }
]

我们确实可以选择使用传统for循环遍历列表:

names_list = []

for student in students:
    names_list.append(student['name'])

print(names_list)

尽管在此示例中,for循环仅用两行代码,但我们甚至不需要编写这么多行。我们可以通过列表理解方法只编写一行代码来完成相同的任务:

names_list = [student['name'] for student in students]

print(names_list)
['Jacob Martin', 'Angela Stevens', 'Ricky Smart']

结论

列表理解实际上还可以减少您的工作量,这真是太神奇了。但是,一开始它似乎令人困惑。对于以前从未涉足此领域的初学者尤其令人困惑,这主要是因为语法。如果您一直在使用其他语言进行编程,您可能还会发现很难理解这个概念,因为它们中都不存在列表理解功能。掌握列表理解的唯一方法是努力练习。