您可能听说过Python的列表理解。也许这甚至是你在没有真正理解的情况下使用的东西。现在是学习的时候了,因为我们将介绍有关Python中列表理解的所有知识。
在开始之前,有必要让自己重新了解数组和列表在Python中是如何工作的,以及如何使用Python字典。
列表理解听起来很复杂,但实际上并不复杂。在Python中,它只是一种根据某些条件快速筛选或细化列表的方法。
它省去了你写几行代码的时间(特别是当你已经在一个循环中的时候),而且它保持了你代码的可读性。
但是,要小心,因为列表理解并不总是答案。很容易忘乎所以,写出难以理解的复杂理解。有时写更多的代码更好,尤其是如果它有助于可读性的话。坚持简单的任务,把代码放在一个单一的职责上。
注意:这些示例都使用python3.6。如果您不确定python3和python2之间的区别,那么请务必阅读我们的Python常见问题解答,我们将在这里讨论这个问题以及更多内容。
考虑复制数组并将数组中的每个字母转换为大写的这段代码。它通过循环数组中的每个项来实现:
letters = ['a', 'b', 'c', 'd']print(letters)upper_letters = []for letter in letters: result = letter.upper() upper_letters.append(result)print(upper_letters)下面是相同的逻辑,除了使用基本的Python列表理解在一行代码中完成之外:
letters = ['a', 'b', 'c', 'd']print(letters)upper_letters = [x.upper() for x in letters]print(upper_letters)如您所见,结果是完全相同的,但是这个过程需要大量的代码而不需要列表理解。
让我们把这个简单的例子分解一下。
本例创建了一个名为letters的列表。它存储小写字母“a”、“b”、“c”和“d”。假设您希望所有这些列表元素都是大写的?在没有列表理解的情况下,您必须创建一个新的列表来存储结果(称为大写字母),循环遍历字母列表中的每个元素,转换每个字母(并将其存储在结果中——可选但良好的做法),然后将大写字母附加到新列表中。多大的工作量啊!
这里的列表理解几乎完全等同于循环选项。它实际上表示“对于字母列表中的每个字母,将它们转换为大写,并将结果作为新列表返回。”
列表理解只能用于列表,并且必须返回新列表。我们再深入一点。
一份理解清单包括三个部分(我们将在下面介绍第三部分)。列表理解必须以方括号([和])开始和结束。这就是它的设计方式,让Python知道您将使用一个列表。
在方括号内,您需要从结果开始。这就是您希望对每个列表元素执行的操作。
在上面的示例中,下面的代码使用upper()方法将每个元素(由变量名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\u letters的变量),你就完成了:
upper_letters = [x.upper() for x in letters]现在,大写字母将包含一个大写字母列表,从“a”开始,然后是“B”,依此类推。
正如我们上面提到的,还有第三部分要列出理解。
完成上述两个步骤后,可以包括一个可选条件。这就像使用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的新列表。旧表是用一个表集合起来的。末尾的if条件意味着只有满足条件的列表元素才会**到新列表中。在这个例子中,任何年龄大于10岁都是允许的。
一旦你掌握了窍门,列表理解是惊人的,但它并不是在任何情况下都有用。当您需要多个条件时,您可能不应该使用它:
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控制Arduino,或者DIY Python网络安全摄像头呢?
...供了几个与列表相关联的内置函数。程序员可以在程序中使用它们。其中两个是,append和extend。本文讨论了append和extend的区别巨蟒append方法主要用于向现有列表中添加一个元素,而extend方法用于向现有列表中添加多个元素。Python...
...过程编程有助于将程序划分为函数。面向对象编程有助于使用对象对软件或程序进行建模。 Perl是一种解释语言。因此,每一行都由解释器逐个读取。高级语言程序可以被程序员理解,但机器却不能理解。因此,指令应转换成机...
...优点是这些语言支持面向对象编程(OOP)。OOP方法有助于使用对象对一个或一组程序进行建模。Ruby和Python的关键区别在于Ruby主要用于web开发,而Python主要用于各种应用程序,包括web开发。Python还常用于科学计算、数据科学应用...
... 然而,如果你不知道如何使用它,你可能会生气。如果您不知道在代码中的什么地方应用它,那就更令人沮丧了。在这里,我们将通过一些实际例子向您展示如何在Python中使用列表理解。 ...
...数据类型告诉编译器(或者在Python的情况下告诉解释器)如何使用数据。数据结构指定可以执行的操作,并且通常实现特定的规则和规定。 ...