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 列表推导式 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]