Python 列表推导式

Python 列表推导式提供了一种简单直接的方式,可以基于其他列表或可迭代对象创建列表。列表推导式语法代码行数少,易于阅读,有助于我们优雅地编写更复杂的功能,而且它

[output_expression for item in L1]

[output_expression for item in L2 if condition]

[output_expression If Else conditions for item in L3]

上述语法表明 Python 列表推导式包含一个 for 循环,用于读取现有列表中的所有元素。它是强大的函数之一,可以使代码更具可读性。

Python 列表推导式示例

以下示例有助于我们学习此内容。在我们开始使用它之前,让我们看看实现相同结果的传统方法。

通常,我们使用 for 循环语法结构以及 append 函数来迭代元素并添加它们。但是,您可以使用 Python 列表推导式获得相同的输出。它易于阅读,执行时间更短。

以下代码用于循环可迭代对象和列表推导式,以迭代项并将每个项附加到新列表。简而言之,我们将项复制到全新的列表。

在这里,我们使用了一种通用方法和一种表达式方法。我们使用了相同的 for 循环,但删除了 append 函数。我建议您参考 Python 页面中的 列表for 循环函数。正如您所注意到的,代码已写在一行中,它返回一个新列表。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
new = []
 
for num in numbers:
    new.append(num)
 
print(new)
 
print("===================")

my = [num for num in numbers]
print(my)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
===================
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

您也可以查看这个 Python 列表推导式示例。在这里,我们将每个项乘以 2。如果您仔细观察,我们对这两个示例都使用了相同的 for 循环,但唯一的区别是 append 函数。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
mul = []
 
for num in numbers:
    mul.append(num * 2)
 
print(mul)
 
print("===================")
 
my = [num * 2 for num in numbers]
print(my)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
===================
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

我们使用列表推导式将元素乘以 2 和 3,并找到每个项的平方。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
doubleA = [i * 2 for i in a]
print(doubleA)
 
tripleA = [i * 3 for i in a]
print(tripleA)
 
squareA = [i ** 2 for i in a]
print(squareA)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

这与上面的示例相同。但是,这次我们还比较了常规方法。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
new1 = []
new2 = []
new3 = []

for num in numbers:
    new1.append(num * 2)
    new2.append(num * 3)
    new3.append(num ** 2)
 
print(new1)
print(new2)
print(new3)
 
print("===================")
doubleN = [num * 2 for num in numbers]
print(doubleN)
 
tripleN = [num * 3 for num in numbers]
print(tripleN)
 
squareN = [num ** 2 for num in numbers]
print(squareN)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
===================
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

在此示例中,第一个语句将每个项乘以自身,依此类推。在这里,方括号决定了计算的优先级。例如,2 * 2 + 1 表示 4 + 1,而 2 * (2 + 1) 表示 2 * 3。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
doubleLi = [n * n for n in numbers]
print(doubleLi)
 
tripleLi = [n * n + 1 for n in numbers]
print(tripleLi)
 
squareLi = [n * (n + 2) for n in numbers]
print(squareLi)
 
s_li = [n * (n + 4) for n in numbers]
print(s_li)
Python List Comprehensions Example

Python 列表推导式 If 语句

在我们之前的所有示例中,我们都使用 for 循环来迭代每个元素并执行计算。如果我们想使用它检查一些条件怎么办?

在这里,我们使用 if 语句 来检查并显示数字中的偶数。首先,我们将 for 循环放在 [] 中。接下来,我们放置了 if 语句。最后,我们将附加项放在 for 循环之前。

n1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
a = []
 
for y in n1:
    if y % 2 == 0:
        a.append(y)
 
print(a)
 
print()
 
b = [y for y in n1 if y % 2 == 0]
print(b)
[2, 4, 6, 8, 10]

[2, 4, 6, 8, 10]

列表推导式多重条件

这种编程语言还允许您使用多个条件。在此示例中,我们使用多个 if 语句 来检查项或值除以 2 是否等于 0。如果为 True,则检查该项是否也可以被 5 整除。如果两者都为 True,则该数字将添加到 a 中。

a = []
 
for n in range(1, 150):
    if n % 2 == 0 and n % 5 == 0:
        a.append(n)
 
print(a)
 
print()
 
b = [n for n in range(1, 150) if n % 2 == 0 if n % 5 == 0]
print(b)
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140]

[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140]

Python 列表推导式 If Else

在此示例中,我们使用 If else。If else 代码检查并显示该值是偶数还是奇数。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(a)
 
b = ["Even" if i % 2 == 0 else "Odd" for i in a]
 
print(b)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even']

嵌套 For 循环

在这里,我们使用嵌套的 for 循环打印乘法表。同样可以通过嵌套来完成。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
a = [[i * j for j in range(1, 11)] for i in range(2, 4)]
 
print(a)
 
# Same using For loop
print()
for i in range(2, 4):
    for j in range(1, 11):
        print(f"{i} * {j} = {i * j}")
[[2, 4, 6, 8, 10, 12, 14, 16, 18, 20], [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]]

2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
2 * 10 = 20
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
3 * 10 = 30

我们需要嵌套列表推导式来转置 3 * 3 矩阵。

a = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]
print(a)
 
b = [[row[i] for row in a] for i in range(3)]
print(b)
[[10, 20, 30], [40, 50, 60], [70, 80, 90]]
[[10, 40, 70], [20, 50, 80], [30, 60, 90]]

嵌套列表推导式将嵌套列表转换为普通列表。

c = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]
print(c)
            
d = [item for row in c for item in row]
print(d)
[[10, 20, 30], [40, 50, 60], [70, 80, 90]]
[10, 20, 30, 40, 50, 60, 70, 80, 90]

在这个列表推导式示例中,我们首先将第一个列表中的每个项(即 a)与第二个列表中的每个元素相加。我的意思是,[10 + 40, 20 + 40, 30 + 40], [10 + 50, 20 + 50, 30 + 50] 等等。

在第二个语句中,我们使用它来通过组合两个现有列表来创建 元组 列表。

a = [10, 20, 30]
b = [40, 50, 60]
            
c = [[i + j for i in a] for j in b]
print(c)
 
print()
d = [[(i, j) for i in a] for j in b]
print(d)
[[50, 60, 70], [60, 70, 80], [70, 80, 90]]

[[(10, 40), (20, 40), (30, 40)], [(10, 50), (20, 50), (30, 50)], [(10, 60), (20, 60), (30, 60)]]

字符串示例

到目前为止,我们使用整数项执行数学计算。但是,您可以在字符串上使用此 Python 列表推导式。

此示例演示如何在此内使用内置函数。第一个将 lower 应用于每个项以将它们转换为小写。第二个将 upper 应用于每个项以将它们转换为大写。

为了更好地理解这一点,我们使用了几个其他函数。第一个使用 swapcase 来交换字母大小写。第二行使用 len 函数 来查找并返回字符串中每个项的长度。在最后一个中,我们捕获每个项的首字母。

fruits = ['ApplE', 'OraNGe', 'GrAPe', 'BaNAna']
print(fruits)
 
low = [a.lower() for a in fruits]
print(low)
 
upp = [a.upper() for a in fruits]
print(upp)

swap = [a.swapcase() for a in fruits]
print(swap)
 
ln = [len(a) for a in fruits]
print(ln)
 
first = [item[0] for item in fruits]
print(first)
['ApplE', 'OraNGe', 'GrAPe', 'BaNAna']
['apple', 'orange', 'grape', 'banana']
['APPLE', 'ORANGE', 'GRAPE', 'BANANA']
['aPPLe', 'oRAngEs', 'gRapE', 'bAnaNA']
[5, 7, 5, 6]
['A', 'O', 'G', 'B']

在这个嵌套列表推导式示例中,我们混合了数字和字符串项。它返回每个水果与数字的组合。我的意思是,Apple 与 1, 2, 3, 4, 5,Orange 与 1, 2, 3, 4, 5 等等。

fruits = ['Apple', 'Orange', 'Grape', 'Banana', 'Kiwi']
numbers = [1, 2, 3, 4, 5]
 
f = [[(fruit, num) for fruit in fruits] for num in numbers]
 
print(f)
 
# Same using For loop
print()
g = []
 
for fruit in fruits:
    for num in numbers:
        g.append((fruit, num))
 
print(g)
[[('Apple', 1), ('Orange', 1), ('Grape', 1), ('Banana', 1), ('Kiwi', 1)], [('Apple', 2), ('Orange', 2), ('Grape', 2), ('Banana', 2), ('Kiwi', 2)], [('Apple', 3), ('Orange', 3), ('Grape', 3), ('Banana', 3), ('Kiwi', 3)], [('Apple', 4), ('Orange', 4), ('Grape', 4), ('Banana', 4), ('Kiwi', 4)], [('Apple', 5), ('Orange', 5), ('Grape', 5), ('Banana', 5), ('Kiwi', 5)]]

[('Apple', 1), ('Apple', 2), ('Apple', 3), ('Apple', 4), ('Apple', 5), ('Orange', 1), ('Orange', 2), ('Orange', 3), ('Orange', 4), ('Orange', 5), ('Grape', 1), ('Grape', 2), ('Grape', 3), ('Grape', 4), ('Grape', 5), ('Banana', 1), ('Banana', 2), ('Banana', 3), ('Banana', 4), ('Banana', 5), ('Kiwi', 1), ('Kiwi', 2), ('Kiwi', 3), ('Kiwi', 4), ('Kiwi', 5)]

字符串数据

您也可以在字符串数据上使用此列表推导式。在这里,我们从字符串中提取每个字符并创建一个新列表。在此示例中,我们将字符串值声明为 Tutorial Gateway。

string = 'Tutorial Gateway' 
print(string)
 
my = [word for word in string]
print(my)
 
# Same using For loop
print()
new1 = []
 
for word in string:
    new1.append(word)
 
print(new1)
Tutorial Gateway
['T', 'u', 't', 'o', 'r', 'i', 'a', 'l', ' ', 'G', 'a', 't', 'e', 'w', 'a', 'y']

['T', 'u', 't', 'o', 'r', 'i', 'a', 'l', ' ', 'G', 'a', 't', 'e', 'w', 'a', 'y']

Python 列表推导式与 Lambda 函数

如果代码行数是我们优先考虑的,那么我们不仅限于此。您可以使用 lambda 函数。在这里,我们使用传统方法和 lambda 函数将每个项乘以自身。

通过查看代码,您可以看到 lambda 函数也非常有用。但是,代码易于阅读且执行速度更快。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = []

for num in numbers:
    a.append(num * num)

print(a)

print()

b = [num * num for num in numbers]
print(b)

print()

c = list(map(lambda num: num * num, numbers))
print(c)

列表推导式与 lambda 函数的最终输出

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

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

这是另一个示例,用于区分列表推导式和 lambda 函数之间的代码可读性。

numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

doubleN = [num * 2 for num in numbers]
print(doubleN)

tripleN = [num * 3 for num in numbers]
print(tripleN)

squareN = [num ** 2 for num in numbers]
print(squareN)

#Lambda Function Example
print("===================")

dN = list(map(lambda num: num * 2, numbers))
print(dN)

tN = list(map(lambda num: num * 3, numbers))
print(tN)

sN = list(map(lambda num: num ** 2, numbers))
print(sN)
[20, 40, 60, 80, 100, 120, 140, 160, 180, 200]
[30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
[100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100, 10000]
===================
[20, 40, 60, 80, 100, 120, 140, 160, 180, 200]
[30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
[100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100, 10000]