解析表达式

2019-04-28  本文已影响0人  Vector_Wan

解析表达式,可以简单高效的处理一个可迭代的对象,并生成结果列表。解析表达式不仅简洁,而且运行速度也比普通的循环快

一、列表推导式

列表推导式就是指 使用轻量级循环创建列表。
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}
上一篇 下一篇

猜你喜欢

热点阅读