跳转至

Python 列表推导式

在本教程中,我们将学习使用 Python 列表推导

Python 列表推导式

列表推导式是一种基于现有列表创建列表的语法结构。 列表推导式为创建列表提供了一种简洁的方法。 常见的要求是创建新列表,其中每个元素是应用于另一序列的每个成员或可迭代的某些操作的结果,或者创建满足特定条件的那些元素的子序列。

Python 列表推导式用法

列表推导可用于:

  • 转换列表
  • 筛选列表

列表推导式的语法受集合的数学符号的影响。 Python 语法受 Haskell 编程语言启发。

S = {x² : x in {0 ... 16}}

这是用于创建一组整数值的数学符号。

L = [expression for variable in sequence [if condition]]

上面的伪代码显示了列表推导式的语法。 它由三部分组成:for 循环,可选条件和表达式。 for 循环遍历整个序列。 对于每个循环,如果满足条件,则对表达式进行求值。 如果计算出该值,它将被添加到新列表中。 for 循环和 if 条件可以有多个。

Python 列表推导式转换列表

下面的示例借助列表推导式将一个列表转换为另一个列表。

multiply_elements.py
1
2
3
4
5
6
#!/usr/bin/python3

a = [1, 2, 3, 4, 5, 6]

b = [e * 2 for e in a]
print(b)

在第一个示例中,我们通过将每个元素乘以 2 从现有列表中创建一个新列表。

b = [e * 2 for e in a]

a列表中的每个元素乘以 2,并将结果添加到新的b列表中。

$ ./multiply_elements.py 
[2, 4, 6, 8, 10, 12]

每个元素都乘以 2。

从摄氏计算华氏温度

我们有摄氏温度的列表。 我们要创建一个新的温度表,以华氏温度表示。

fahrenheit_celsius.py
1
2
3
4
5
6
#!/usr/bin/python3

celsius = [22, 28, 33, 42, 52]

fahr = [e * 9/5 + 32 for e in celsius]
print(fahr)

该示例创建了一个新的华氏温度列表,该列表是根据摄氏温度列表计算得出的。

fahr = [e * 9/5 + 32 for e in celsius]

计算是在 Python 列表推导的第三个表达式部分中完成的。

$ ./fahrenheit_celsius.py 
[71.6, 82.4, 91.4, 107.6, 125.6]

这是示例的输出。

Python 列表推导式过滤列表

在下面的示例中,我们将使用列表推导式来过滤列表。

filter_positive.py
1
2
3
4
5
6
#!/usr/bin/python3

a = [-4, 2, 0, -1, 12, -3]

b = [e for e in a if e > 0]
print(b)

我们有一个整数列表。 我们创建一个仅包含正整数的新列表。

b = [e for e in a if e > 0]

为了只包含正数,我们使用了if条件,该条件应用于每个元素。 仅当满足条件的元素才包含在新列表中。

$ ./filter_positive.py 
[2, 12]

这是示例的输出。

下一个示例按元素类型过滤元素。

filter_by_type.py
1
2
3
4
5
6
7
8
9
#!/usr/bin/python3

a = ['a', 2, 'c', 12, 3, 'd']

b = [e for e in a if type(e) == int]
c = [e for e in a if type(e) == str]

print(b)
print(c)

我们有一个元素列表,它们是整数和字符串。 我们创建两个新列表; 一个只有整数,只有一个字符串。

b = [e for e in a if type(e) == int]

在这里,我们创建一个列表b,它将仅包含整数值。 type()功能用于确定元素的类型。

1
2
3
$ ./filter_by_type.py 
[2, 12, 3]
['a', 'c', 'd']

这是示例的输出。

Python 列表推导式多个if条件

Python 列表推导中的条件可以使用多个。

multiple_conditions.py
1
2
3
4
5
6
#!/usr/bin/python3

a = [9, 2, 18, 14, 22, 11, 7, 19, 23]

b = [e for e in a if e > 10 if e < 20]
print(b)

我们从列表a创建一个新的整数列表,它们大于 10 且小于 20。

b = [e for e in a if e > 10 if e < 20]

在此列表推导式中,我们使用两个 if 条件。

$ ./multiple_conditions.py 
[18, 14, 11, 19]

这是示例的输出。

Python 列表推导式多个for循环

Python 列表推导中可能有多个for循环。

multiple_for_loops.py
1
2
3
4
5
6
7
#!/usr/bin/python3

a = [1, 2, 3]
b = ['A', 'B', 'C']

c = [ str(i) + j for i in a for j in b]
print(c)

该示例创建两个列表的笛卡尔乘积。

c = [ str(i) + j for i in a for j in b]

两个 for 循环用于创建笛卡尔乘积。

$ ./multiple_for_loops.py 
['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']

这是示例的输出。

下一个示例显示如何展平 Python 列表。

flatten_list.py
1
2
3
4
5
6
#!/usr/bin/python3

nums = [[1, 2, 3], [3, 4, 5], [6, 7, 8]]

c = [ e for num in nums for e in num]
print(c)

nums列表是嵌套列表的列表。 我们用列表推导式来使列表扁平化。

c = [ e for num in nums for e in num]

第一个循环遍历外部列表。 第二个 for 循环遍历嵌套列表。

$ ./flatten_list.py 
[1, 2, 3, 3, 4, 5, 6, 7, 8]

这是示例的输出。

Python 嵌套列表推导式

Python 列表推导式中的初始表达式可以是另一个列表推导式。

nested_list_comprehension.py
1
2
3
4
5
6
7
8
#!/usr/bin/python3

M1 = [[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]]

M1_tr = [[row[i] for row in M1] for i in range(3)]
print(M1_tr)

该示例定义一个矩阵,列表推导从原始矩阵创建一个转置矩阵。

$ ./nested_list_comprehension.py 
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

这是示例的输出。

Eratosthenes

Eratosthenes 的筛子是一种古老的计算素数的算法。 质数(或素数)是大于 1 的自然数,除 1 及其本身外没有除数。 该算法将每个素数的倍数从 2 的倍数开始迭代标记为复合(即不是素数)。

sieve_of_eratosthenes.py
1
2
3
4
5
#!/usr/bin/python3

no_primes = [j for i in range(2, 8) for j in range(i*2, 100, i)]
primes = [e for e in range(2, 100) if e not in no_primes]
print (primes)

该示例计算的质数最大为 100。

no_primes = [j for i in range(2, 8) for j in range(i*2, 100, i)]

首先,我们创建一个不是素数的数字列表。

primes = [e for e in range(2, 100) if e not in no_primes]

质数就是这些没有包含在no_primes列表中的数字。

$ ./sieve_of_eratosthenes.py 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

这是输出。

在本教程中,我们介绍了 Python 列表推导。