解析表达式,可以简单高效的处理一个可迭代的对象,并生成结果列表。解析表达式不仅简洁,而且运行速度也比普通的循环快。
一、列表推导式
列表推导式就是指 使用轻量级循环创建列表。
- 一般方法创建列表:
list1 = []
for i in range(10):
list1.append(i)
print(list1)
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- 列表推导式
list3 = [i for i in range(2, 17, 2)]
list3
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
对于有两个变量的循环也可使用列表推导式:
例如:
给定二维列表:
d = [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
把它转换成一维的:
d = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def fun1(d = []):
a = []
for i in range(len(d)):
for j in range(len(d[i])):
a.append(d[i][j])
return a
它等价于:
def fun2(d = []):
a = [d[i][j] for i in range(len(d)) for j in range(len(d[i]))]
return a
推导式甚至可以更加灵活:
m= [[1,2,3],[4,5,6],[7,8,9]]
>>>[row[1] for row in m]
>>>[2,5,8]
针对带有 ‘_’ 的 for 循环可以使用类似如下的列表推导式:
- 一般方法
list1 = []
for _ in range(10):
list1.append('不给我鲁班我就送')
print(list1)
>> ['不给我鲁班我就送', '不给我鲁班我就送', ... '不给我鲁班我就送']
- 列表推导式
list4 = ["不给我鲁班我就送" for _ in range(10)]
print(list4)
>> ['不给我鲁班我就送', '不给我鲁班我就送', ... '不给我鲁班我就送']
循环的过程中使用 if :
- 一般方法
from random import randint
l = [randint(-10,10) for _ in range(10)] # 生成 10 个元素,范围在【-10,10】区间的列表
print('原列表:', l)
# 选出大于等于 0 的数据
res = []
for x in l:
if x>= 0:
res.append(x)
print("使用for循环筛选:", res)
>> 原列表: [-2, 9, -9, -1, 3, 2, -2, -5, -2, -7]
>> 使用for循环筛选: [9, 3, 2]
- 列表推导式
res2 = [x for x in l if x >= 0]
print("使用列表推导式删选:", res2)
>> 使用列表推导式删选: [9, 3, 2]
二、字典解析
创建一个班级的分数:
from random import randint
grades = {'Student{}'.format(i):randint(50,100) for i in range(1, 21)}
print(grades)
>> {'Student1': 97, 'Student2': 97, 'Student3': 100, ..., 'Student20': 98}
筛选出高于 90 分的人:
d = {k:v for k, v in grades.items() if v >= 90}
print(len(d))
print(d)
>> 7
>> {'Student1': 97, 'Student2': 97, 'Student3': 100, ... 'Student20': 98}
网友评论