freeCodeCamp/guide/chinese/python/lists/list-comprehension/index.md

116 lines
3.6 KiB
Markdown
Raw Normal View History

---
title: List Comprehension
localeTitle: 列表理解
---
## 列表理解
List Comprehension是一种循环遍历列表以基于某些条件生成新列表的方法。它起初可能令人困惑但一旦你适应了语法它就会非常强大和快速。
学习如何使用列表理解的第一步是查看循环遍历列表的传统方式。以下是一个返回偶数数字新列表的简单示例。
```python
# Example list for demonstration
some_list = [1, 2, 5, 7, 8, 10]
# Empty list that will be populate with a loop
even_list = []
for number in some_list:
if number % 2 == 0:
even_list.append(number)
# even_list now equals [2, 8, 10]
```
首先使用一些数字创建一个列表。然后创建一个空列表用于保存循环中的结果。在循环中检查每个数字是否可被2整除如果是则将其添加到even\_list。这需要5行代码不包括注释和空格在这个例子中并不多。
现在为列表理解示例。
```python
# Example list for demonstration
some_list = [1, 2, 5, 7, 8, 10]
# List Comprehension
even_list = [number for number in some_list if number % 2 == 0]
# even_list now equals [2, 8, 10]
```
另一个例子,有两个相同的步骤: 以下将创建一个与`my_starting_list`的数字相乘的数字`my_starting_list`乘以7。
```py
my_starting_list = [1, 2, 3, 4, 5, 6, 7, 8]
my_new_list = []
for item in my_starting_list:
my_new_list.append(item * 7)
```
运行此代码时, `my_new_list`的最终值为: `[7, 14, 21, 28, 35, 42, 49, 56]`
使用列表`my_new_list`的开发人员可以使用以下列表`my_new_list`实现相同的结果,这导致相同的`my_new_list` 。
```py
my_starting_list = [1, 2, 3, 4, 5, 6, 7, 8]
my_new_list = [item * 7 for item in my_starting_list]
```
以列表理解方式编写的简单公式是:
`my_list = [{operation with input n} for n in {python iterable}]`
但是如果要更改从iterable返回的项请将`{operation with input n}`替换为。上面的例子使用`n * 7`但操作可以根据需要简单或复杂。
用任何iterable替换`{python iterable}` 。 [序列类型](https://guide.freecodecamp.org/python/sequence-types)将是最常见的。在上面的示例中使用了一个列表,但元组和范围也很常见。
如果满足某些条件,列表理解会将现有列表中的元素添加到新列表中。它更整洁,但在大多数情况下也快得多。在某些情况下,列表理解可能会妨碍可读性,因此在选择使用列表理解时,开发人员必须权衡他们的选项。
## 带条件的列表理解的例子
可以使用条件来控制列表推导中的控制流。例如:
```py
only_even_list = [i for i in range(13) if i%2==0]
```
这相当于以下循环:
```py
only_even_list = list()
for i in range(13):
if i%2 == 0:
only_even_list.append(i)
```
列表推导还可以包含嵌套的if条件。考虑以下循环
```py
divisible = list()
for i in range(50):
if i%2 == 0:
if i%3 == 0:
divisible.append(i)
```
使用列表理解,这可以写成:
```py
divisible = [i for i in range(50) if i%2==0 if i%3==0]
```
If-Else语句也可以与列表理解一起使用。
```py
list_1 = [i if i%2==0 else i*-1 for i in range(10)]
```
#### 更多信息:
[Python数据结构 - 列表](https://docs.python.org/2.7/tutorial/datastructures.html)
[Python for Loops](https://guide.freecodecamp.org/python/for-loop-statements)
[Python列表](https://guide.freecodecamp.org/python/learn-about-python-lists)
[Python初学者 - 列表理解](http://www.pythonforbeginners.com/basics/list-comprehensions-in-python)