geekdoc-python-zh/docs/askpython/python-list-comprehension.md

4.5 KiB
Raw Permalink Blame History

在 Python 中使用列表理解

原文:https://www.askpython.com/python/list/python-list-comprehension

大家好!今天,我们将讨论如何在 Python 中使用列表理解。

列表理解通常是一种语法糖,使代码更容易阅读和编写。

通常,当我们处理涉及创建列表的代码时,反复编写嵌套循环是很麻烦的。

Python 通过引入这一特性使我们的工作变得更加容易。

现在让我们通过合适的例子来了解如何在我们的程序中使用它!


列表理解的基本结构

让我们考虑以下正常编写的代码:

word = "Hello from AskPython"
letters = []

for letter in word:
    letters.append(letter)

print(letters)

输出

['H', 'e', 'l', 'l', 'o', ' ', 'f', 'r', 'o', 'm', ' ', 'A', 's', 'k', 'P', 'y', 't', 'h', 'o', 'n']

上面的代码片段打印了单词中的字母列表。

我们可以使用列表理解来缩短这段代码,因为列表的元素有一个共同的属性:它们是字母,并且它们将被追加到列表中。

现在让我们使用列表理解来使它更简短和易读:

word = "Hello from AskPython"

letters = [letter for letter in word]

print(letters)

输出

['H', 'e', 'l', 'l', 'o', ' ', 'f', 'r', 'o', 'm', ' ', 'A', 's', 'k', 'P', 'y', 't', 'h', 'o', 'n']

看到有多简单了吗?代码的意图很清楚:我们选取单词的字母,并直接将其添加到我们的列表中!

现在,我们也可以用列表理解其他的可重复项了!

再举一个例子,我们可以生成 1 到 10 的数字的平方。

正常的方法如下:

squares = []

for i in range(1, 11):
    squares.append(i * i)

print(squares)

输出

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

虽然这已经足够小了,但是我们可以使用列表理解做得更好。我们可以把它减少到只有两行代码!

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

我们现在向您展示了理解列表的能力!现在让我们通过处理像ifelse这样的条件句来给它添加一些趣味吧!


在列表理解中使用条件

在我们的列表理解中,我们可以使用ifelse 条件句

让我们考虑第一种情况,这里我们只有一个if条件。

这种列表理解的一般结构如下:

list = [item for item in iterable if condition]

所以在这里,list将只由item组成,其中condition成立。

让我们以之前构建正方形的例子为例,使用if将其限制为偶数。

squares = [i * i for i in range(1, 11) if i % 2 == 0]
print(squares)

输出

[4, 16, 36, 64, 100]

事实上,我们在这里只能得到偶数个元素方块,因为只有当 I 是偶数时。

现在让我们看看第二种情况,我们也有一个else条件。该结构现在将如下所示:

list = [value1 if condition else value2 for item in iterable]

这里,如果condition == True,列表将包含value1的元素,如果condition == False,则包含value2的元素。

现在让我们举一个例子,我们一直打印整数方块,直到i<=5。如果我> 5我们将打印 0。

我们的列表理解现在看起来像这样:

my_list = [i * i if i <= 5 else 0 for i in range(10)]
print(my_list)

输出

[0, 1, 4, 9, 16, 25, 0, 0, 0, 0]

如您所见,该列表仅包含所有< = 5 的数字的平方。其余元素设置为 0

我们也可以使用其他条件,甚至 lambda 函数,如果我们愿意的话!

这里有一个稍微有点做作的例子,它使用一个lambda从 0 开始计算连续的对和。(0, 1 + 2, 2 + 3, 3 + 4..)

pair_sums = [(lambda x, y: x + y)(i, j) if i > 1 else 0 for i, j in zip(range(1, 11), range(0, 10))]
print(pair_sums)

输出

[0, 3, 5, 7, 9, 11, 13, 15, 17, 19]

如您所见,这段代码可读性不是很好,如果使用其他代码可能会更好!

所以,如果你想一次做太多事情,小心不要使用列表理解。当您想要运行简单的循环条件语句来构建列表时,最好坚持使用这种方法,而不是当您想要对每个元素单独执行数学计算时。


结论

在本文中,我们学习了使用 Python 的列表理解语义。这使得使用迭代循环来减少重复编写代码变得更加容易!

参考