ZetCode

Python 列表推导式

最后修改于 2024 年 1 月 29 日

在本文中,我们将学习使用 Python 列表推导式。

Python 列表推导式

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

Python 列表推导式用法

列表推导式可用于

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

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

这是创建整数值集合的数学表示法。

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

上面的伪代码展示了列表推导式的语法。它包含三个部分:一个 for 循环,可选的条件,和一个表达式。for 循环遍历序列。对于每个循环,如果满足条件,则会评估一个表达式。如果计算出该值,则将其添加到新列表中。可以有多个 for 循环和 if 条件。

Python 列表推导式转换列表

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

multiply_elements.py
#!/usr/bin/python

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]

每个元素都乘以二。

从摄氏度计算华氏度温度

我们有一个摄氏度温度列表。我们想创建一个新的华氏度温度列表。

fahrenheit_celsius.py
#!/usr/bin/python

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
#!/usr/bin/python

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
#!/usr/bin/python

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 函数用于确定元素的类型。

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

Python 列表推导式谓词

谓词是返回布尔值的函数。如果条件过于复杂,我们可以将其放入谓词中。

predicate.py
#!/usr/bin/python

def is_vowel(c):

    vowels = 'aeiou'

    if c in vowels:
        return True
    else:
        return False


sentence = 'There are eagles in the sky.'

vowels = [c for c in sentence if is_vowel(c)]
print(vowels)

该示例过滤掉句子中的所有元音字母。

def is_vowel(c):

    vowels = 'aeiou'

    if c in vowels:
        return True
    else:
        return False

该函数是一个谓词。对于元音字母,它返回 True。

vowels = [c for c in sentence if is_vowel(c)]

if 条件的逻辑委托给了 is_vowel 谓词。

$ ./predicate.py
['e', 'e', 'a', 'e', 'e', 'a', 'e', 'i', 'e']

if 条件在前

if 条件也可以放在前面。这样数据就可以被转换。

infront.py
#!/usr/bin/python

data = ["even" if i % 2 == 0 else "odd" for i in range(7)]
print(data)

在示例中,我们使用列表推导式将值转换为 "even""odd" 值。

$ ./infront.py
['even', 'odd', 'even', 'odd', 'even', 'odd', 'even']

Python 列表推导式多个 if 条件

在 Python 列表推导式中使用多个 if 条件是可能的。

multiple_conditions.py
#!/usr/bin/python

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
#!/usr/bin/python

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
#!/usr/bin/python

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
#!/usr/bin/python

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]]

埃拉托斯特尼筛法

埃拉托斯特尼筛法是一种计算素数的古老算法。素数(或质数)是大于 1 且除了 1 和自身以外没有正因数的自然数。该算法通过迭代地将每个素数的倍数标记为合数(即非素数),从 2 的倍数开始。

sieve_of_eratosthenes.py
#!/usr/bin/python

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 数据结构 - 语言参考

在本文中,我们介绍了 Python 列表推导式。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程