文章目录
什么是列表解析式
列表解析(list comprehension)提供了一种优雅的生成列表的方法,能用一行代码代替十几行代码的同时不损失任何可读性。而且,性能还快很多很多!
举个栗子,如果我们要得到 1-100 所有偶数组成的列表,正常情况下是这样的:
lst = []
for i in range(1,101):
if i%2==0:
lst.append(i)
用列表解析来做是这样的:
lst = [i for i in range(1,101) if i%2==0]
简单的一行代码代替了四行代码
从上边的例子来看列表解析式的语法其实不难,可以分为三部分来看:
i
最后执行的结果for i in range(1,101)
i的来源if i%2==0
判断条件
例1,取文本中所有单词的第一个字符
words = "you need python"
frist_char = [word[0] for word in words.split()]
从上边这个例子中可以看出,列表解析的第一部分也可以是一个表达式,第三部分判断条件也是可以省略的。
例2,获取两个列表对应位的乘积
lst1 = [2,3,4]
lst2 = [5,6,7]
lst = [i*j for i,j in zip(lst1,lst2)]
上边的例子中,除了列表解析,还需要zip函数来帮忙,通过zip函数将lst1,lst2两个列表的对应位打包起来!
例3,带三元表达式的列表解析
需求:将列表中可以转换为数字的字符串转换为对应的数字,不能转换的内容则修改为None
>>>lst = ['99','18','q','%','20%']
>>>lst = [int(i) if i.isdigit() else None for i in lst]
[99, 18, None, None, None]
例4,获取一个全0列表
有时候我们可能需要获取一个长度指定,全零或者全为某个值的列表
>>>lst = ["ok" for i in range(5)]
['ok', 'ok', 'ok', 'ok', 'ok']
例5,嵌套循环的列表解析
# 将二维列表中的元素抽取到一维列表中
>>>lsts = [[1,2,3],[4,5],[7,8,9]]
>>>lst = [i for lst in lsts for i in lst]
[1, 2, 3, 4, 5, 7, 8, 9]
例6,笛卡尔积
lst1 = ["ming","ning","tian"]
lst2 = ["love","like","at"]
lst3 = ["top","mid","bot"]
lst = [{
"player":x,"action":y,"position":z} for x in lst1 for y in lst2 for z in lst3]
这样就得到一个包含所有参数项目的字典列表,避免了写若干个for循环
例7,多值的列表解析
D = {
'one': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5
}
lst = [f'{key} = {value}' for (key, value) in D.items()]
例8,列表解析打印内容
lst = [1,2,3,4]
[print(i) for i in lst]