如何使用Python列表推导(以及何时不使用它们)

您可能已经听说过Python的列表理解功能。甚至可能是您在没有真正理解的情况下使用过的东西。现在是时候学习了,因为我们涵盖了您需要了解的有关Python中的列表理解的所有知识。

在开始之前,值得刷新一下数组和列表在Python中的工作方式。

列表理解听起来很复杂,但实际上并非如此。在Python中,这只是一种根据某些条件过滤或优化列表的快速方法。

它省去了编写多行代码(特别是如果您已经处于循环中)的麻烦。保持代码整洁的可读性。

但是要小心,因为列表理解并不总是答案。很容易迷失方向并撰写难以理解的复杂理解。有时编写更多代码会更好,特别是如果它有助于提高可读性。坚持简单的任务,并使代码承担全部责任。

如何在Python中使用列表推导

注意:这些示例都使用Python 3.6。如果您不确定Python 3和Python 2之间的区别,请确保阅读我们的Python FAQ,其中涵盖了此问题以及更多内容。

请考虑以下代码,该代码复制了数组并将数组中的每个字母变成大写。它是通过遍历数组中的每个项来做到这一点的:如您所见,结果是完全一样的,但是该过程涉及大量代码而没有列表理解。

让我们分解一下这个简单的示例。

该示例创建了一个名为字母。这将存储小写字母“ a",“ b",“ c"和“ d"。假设您希望所有这些列表元素都大写?好吧,如果没有列表理解,您必须创建一个新列表来存储结果(称为 upper_letters ),在 letters 列表中的每个元素上循环,转换每个字母(然后将其存储在结果中(可选,但好的做法),然后将大写字母附加到新列表中。

这里的列表理解几乎完全等同于循环选择。它有效地说:“对于字母列表中的每个字母,将其转换为大写字母,然后将结果作为新列表返回。"

列表推导只能在列表上使用,并且必须返回新列表。让我们更深入地研究。

列表理解分为三个部分(我们将在下面介绍第三部分)。列表理解必须以方括号( [] )开头和结尾。这就是它的设计方式,并让Python知道您将要使用列表。

在方括号内,您需要从结果开始。这就是您要对每个列表元素执行的操作。

在上面的示例中,以下代码通过使用以下代码将每个元素(由变量名 x 引用)转换为大写字母: upper()方法,该方法是Python核心库的一部分:

[x.upper() # will not run, only half the comprehension at this point

下一步,您需要告诉Python要处理的列表,并将每个单独的元素分配给一个变量。这与长期示例中的for循环完全相同:

for x in letters

每次循环遍历列表时, x 的值将更改为当前元素。它将以“ a"开头,然后是“ b",依此类推。

如果将它们放在一起(并将其分配给名为 upper_letters 的变量),您将完成:

upper_letters = [x.upper() for x in letters]

现在, upper_letters 将包含一个大写字母列表,从“ A"开始,然后是“ B",依此类推。

Python列表理解的第三部分

如上所述,第三部分列出了列表理解。

完成上述两个步骤后,您将可以包含可选条件。这就像使用 if 语句说“基于此旧列表,使我成为新列表,但仅包含符合我的条件的元素"。

这就是它的外观例如:

ages = [1, 34, 5, 7, 3, 57, 356]print(ages)old_ages = [x for x in ages if x > 10]print(old_ages)

此示例使用了一个名为 ages 的新列表。 old_ages 列表是使用列表理解来组装的。最后的 if 条件意味着仅将符合条件的列表元素插入到新列表中。在此示例中,允许任何大于10岁的年龄。

何时不使用Python列表推论

一旦您掌握了列表推论,列表推导就很棒了,但事实并非如此在任何情况下都有用。当您需要多个条件时,您可能不应该使用它:

old_ages = [x for x in ages if x > 10 and x < 100 and x is not None]

此代码有效,但是开始变得冗长而混乱。同样,除简单的函数调用外,其他任何操作都可能无法正常工作。在此示例中,您将得到一个错误:

letters = ['a', 'b', 'c', 'd', 2]print(letters)upper_letters = [x.upper() for x in letters]print(upper_letters)

这是完全有效的代码,但由于不能将数字大写,因此无法使用。这是实际需要较长循环的一种情况,因为您可以执行一些异常处理:

letters = ['a', 'b', 'c', 'd', 1]print(letters)upper_letters = []for letter in letters:  try:    result = letter.upper()    upper_letters.append(result)  except AttributeError:    pass # do nothingprint(upper_letters)

开始使用Python列表推导

现在知道Python中的列表理解有多么容易,没有理由不使用它。只需记住要保持简单,并首先考虑可读性。

也许您将使用Python控制Arduino?

标签: 编码教程 Python