本教程介绍列表理解在 Python 中的工作原理。它包含许多示例,可以帮助您熟悉这个概念,并且您应该能够在本课程结束时在您的实际项目中实现它。
目录
列表推导式 vs. For 循环 vs. Lambda + map()
列表推导式 vs. For 循环 vs. Lambda + map()
f(x) = x2
函数式编程也有利于并行计算,因为没有共享数据或对同一变量的访问。
列表理解是函数式编程的一部分,它提供了一种无需编写 for 循环即可创建列表的简洁方法。
for clause
迭代列表的每个项目。if clause
过滤器列出并仅返回满足过滤条件的项目。if 子句是可选的,因此如果没有条件语句,可以忽略它。
[i**3 for i in [1,2,3,4] if i>2]
意思是迭代地从列表[1,2,3,4]中取出一项,然后检查它是否大于2。如果是,则取它的立方。否则,如果该值小于或等于 2,则忽略该值。稍后,它会创建值 3 和 4 的立方体列表。 Output : [27, 64]
[i**2 表示 i 在范围 (2,10) 内]
[i**2 for i in range(2,10)]
平方根 = [] 对于范围 (2,10) 内的 i: sqr.append(i**2) 平方根
sqr = [] for i in range(2,10): sqr.append(i**2) sqr
列表(地图(lambda i: i**2, 范围(2, 10)))
list(map(lambda i: i**2, range(2, 10)))
列表理解正在执行循环操作,然后仅用一行代码将项目组合到列表中。它比 for 循环和 lambda 更容易理解、更清晰。输出 [4, 9, 16, 25, 36, 49, 64, 81]
Output [4, 9, 16, 25, 36, 49, 64, 81]
range(2,10)
返回 2 到 9(不包括 10)。
**2
指的是平方(数字的 2 次方)。sqr = []
创建空列表。append( )
函数在 for 循环中存储序列每次重复的输出(即平方值)。
map( )
将 lambda 函数应用于可迭代(列表)的每个项目。将其包装起来list( )
以生成列表作为输出
if x%2 == 0
检查一个数是否为偶数。例如,5 % 2
返回 1,即余数。如果余数为0,则表示是偶数。
l1= [x**2 for x in range(1, 10**7) if x % 2 == 0] # 处理时间:3.96 秒
l1= [x**2 for x in range(1, 10**7) if x % 2 == 0] # Processing Time : 3.96 seconds
平方根 = [] 对于范围 (1, 10**7) 内的 x: 如果 x%2 == 0: sqr.append(x**2) # 处理时间:5.46 秒
sqr = [] for x in range(1, 10**7): if x%2 == 0: sqr.append(x**2) # Processing Time : 5.46 seconds
l0 = 列表(映射(lambda x: x**2, 过滤器(lambda x: x%2 == 0, 范围(1, 10**7)))) # 处理时间:5.32 秒
l0 = list(map(lambda x: x**2, filter(lambda x: x%2 == 0, range(1, 10**7)))) # Processing Time : 5.32 seconds
filter(lambda x: x%2 == 0, range(1, 10**7))
返回 1 到(10 的 7 次方)之间的偶数,因为 filter() 函数用于从列表中提取项目子集。粗略地说,您可以将 filter() 视为WHERE
SQL 子句。
upper( )
将字符串转换为大写。同样,您可以使用lower( )
函数将字符串转换为小写。
mylist = ['戴夫', '迈克尔', '深渊'] [x.upper() if len(x)>4 else x.lower() for x in mylist]
mylist = ['Dave', 'Micheal', 'Deeps'] [x.upper() if len(x)>4 else x.lower() for x in mylist]
k = [] 对于我的列表中的 x: 如果 len(x) > 4: k.append(x.upper()) 别的: k.append(x.lower()) k
k = [] for x in mylist: if len(x) > 4: k.append(x.upper()) else: k.append(x.lower()) k
IF
子集或过滤字典。
d = {'a': [1,2,1], 'b': [3,4,1], 'c': [5,6,2]}
d = {'a': [1,2,1], 'b': [3,4,1], 'c': [5,6,2]}
[x for x in d['b'] if x >2] 输出 [(3, 4)]
[x for x in d['b'] if x >2] Output [(3, 4)]
在上面的程序中,x 指的是 d['a'],y 指的是 d['b']。[(x,y) for x, y in zip(d['a'],d['b']) if x == 1 and y > 1] 输出 [(1, 3)]
[(x,y) for x, y in zip(d['a'],d['b']) if x == 1 and y > 1] Output [(1, 3)]
all( )
检查列表中所有值的条件。它返回 True/False。
k
指的是字典的键,v
指的是字典的值。
只有键[(k,v) for k,v in d.items() if all(x > 1 for x in v) ] 输出 [('c', [5, 6, 2])]
[(k,v) for k,v in d.items() if all(x > 1 for x in v) ] Output [('c', [5, 6, 2])]
c
包含全部大于 1 的值。类似地,我们有一个any( )
函数,如果任何值满足条件,则返回 True。
[(k,v) for k,v in d.items() if any(x > 2 for x in v) ] 输出 [('b', [3, 4, 1]), ('c', [5, 6, 2])]
[(k,v) for k,v in d.items() if any(x > 2 for x in v) ] Output [('b', [3, 4, 1]), ('c', [5, 6, 2])]
将 pandas 导入为 pd df = pd.DataFrame({'name': ['Sandy', 'Sam', 'Wright', 'Atul'], '预薪': [71, 65, 64, 90], '下一个工资': [75, 80, 61, 89]}) df
import pandas as pd df = pd.DataFrame({'name': ['Sandy', 'Sam', 'Wright', 'Atul'], 'prevsalary': [71, 65, 64, 90], 'nextsalary': [75, 80, 61, 89]}) df
我们需要创建一个名为“Flag”的列,其值为“High Bracket”或“Low Bracket”。如果列的值姓名 前工资 下工资 0 桑迪 71 75 1 萨姆 65 80 2 赖特 64 61 3 阿图尔 90 89
name prevsalary nextsalary 0 Sandy 71 75 1 Sam 65 80 2 Wright 64 61 3 Atul 90 89
prevsalary
大于 70,则应将其标记为“高括号”。否则将其指定为“低括号”。
上面的代码行在 df 数据框中生成了一个新列。df['Flag'] = ["高括号" if x > 70 else "低括号" for x in df['prevsalary']]
df['Flag'] = ["High Bracket" if x > 70 else "Low Bracket" for x in df['prevsalary']]
名称 prevsalary nextsalary 标志 0 桑迪 71 75 高支架 1 Sam 65 80 低支架 2 莱特 64 61 低支架 3 Atul 90 89 高支架
name prevsalary nextsalary Flag 0 Sandy 71 75 High Bracket 1 Sam 65 80 Low Bracket 2 Wright 64 61 Low Bracket 3 Atul 90 89 High Bracket
prevsalary
和nextsalary
。如果 prevsalary > nextsalary,则将其分类为“增加”。否则填充“减少”值。
df['Flag2'] = [“增加”如果 x > y 否则“减少” for (x,y) in zip(df['nextsalary'],df['prevsalary'])]
df['Flag2'] = ["Increase" if x > y else "Decrease" for (x,y) in zip(df['nextsalary'],df['prevsalary'])]
这里我们在列表理解中比较两个变量 x 和 y名称 prevsalary nextsalary Flag Flag2 0 桑迪 71 75 高括号增加 1 Sam 65 80 低支架增加 2 赖特 64 61 低括号减少 3 Atul 90 89 高括号减少
name prevsalary nextsalary Flag Flag2 0 Sandy 71 75 High Bracket Increase 1 Sam 65 80 Low Bracket Increase 2 Wright 64 61 Low Bracket Decrease 3 Atul 90 89 High Bracket Decrease
x = df['nextsalary'], y = df['prevsalary']
将 pandas 导入为 pd df = pd.DataFrame({"col1" : ['1', '2', '3']})
import pandas as pd df = pd.DataFrame({"col1" : ['1', '2', '3']})
请参阅下面的输出。df['col2'] = [int(x) for x in df['col1']]
df['col2'] = [int(x) for x in df['col1']]
col2
具有整数列类型。
这可以在没有列表理解的情况下解决,因为 pandas 具有相同的内置函数列1 对象 列2 int64
col1 object col2 int64
df['col2'] = df['col1'].astype(int)
相当于多个for循环。嵌套列表理解的标准语法如下所示
假设您有一个列表列表,并且您只想选择奇数。任何不能被 2 整除的数都是奇数。mat = [[1,2],[3,4],[5,6]] [x 表示垫中的行,表示行中的 x,如果 x%2==1]
mat = [[1,2], [3,4], [5,6]] [x for row in mat for x in row if x%2==1]
多重For循环
b = [] 对于垫子中的行: 对于行中的 x: 如果 x%2 == 1: b.追加(x) b
b = [] for row in mat: for x in row: if x%2 == 1: b.append(x) b
输出 [1, 3, 5]
Output [1, 3, 5]
在下面的代码中,我们仅选择键mylist = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}]
mylist = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}]
a
以及该键大于 1 的所有值。
[i['a'] for i in mylist if 'a' in i if i['a'] > 1] 输出 [3, 5]
[i['a'] for i in mylist if 'a' in i if i['a'] > 1] Output [3, 5]
l1 = ['a','b'] l2 = ['c','d'] [(x,y) 对于 l1 中的 x 对于 l2 中的 y]
l1 = ['a','b'] l2 = ['c','d'] [(x,y) for x in l1 for y in l2]
输出 [('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]
Output [('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]
text = [“生活是美好的”,“无需过度思考”,“冥想有助于克服抑郁症”]
[文本中的单词对句子中的单词对句子中的单词.lower().split(' ')]
['生活', '是', '美丽的', '不', '需要', '到', '想多了', '冥想', '帮助', '在', ‘克服’, '沮丧']
['life', 'is', 'beautiful', 'no', 'need', 'to', 'overthink', 'meditation', 'help', 'in', 'overcoming', 'depression']
for sentence in text
表示循环遍历列表中的每个句子text
text[0].lower().split(' ')
转换为小写,然后将句子分成单词并返回['life', 'is', 'beautiful']
1.is, in, to, no
从text
列表中删除这些单词。所需的输出应如下 -
'生活', '美丽的', '需要', '想多了', '冥想', '帮助', ‘克服’, '沮丧'
'life', 'beautiful', 'need', 'overthink', 'meditation', 'help', 'overcoming', 'depression'
2. 在列表中查找匹配的号码。
x = [51, 24, 32, 41] y = [42, 32, 41, 50]
x = [51, 24, 32, 41] y = [42, 32, 41, 50]
输出应为 [32, 41]
3.如果列表元素在30到45之间,则为1,否则为0
x = [51, 24, 32, 41]
输出:[0,0,1,1]
x = [51, 24, 32, 41] Output : [0, 0, 1, 1]