List Comprehension
炫酷的列表解析
- 列表解析代码量少
- 列表解析的速度比for in快
- 最最最重要的,它太酷了!!!
基本语法
ret = [expression for item in iterator]
等价于
ret = []
for item in iterator:
ret.append(expression)
小例子
传统的for循环
l = list(range(10))
for i in l:
l.append(i)
l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
炫酷的大列表解析
l = list(range(10))
print([x + 1 for x in l])
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
结果虽然一样,但我们对比下性能
import timeit
lst = list(range(10))
def fn1():
[x + 1 for x in lst]
def fn2():
l = []
for x in lst:
l.append(x+1)
print(timeit.timeit(fn1)) #1000万次的循环
print(timeit.timeit(fn2)) #1000万次的循环
好玩的事情来啦~,下面是各函数执行消耗时间,很明显大列表解析
要比for
循环要强
2.1591712861280925
3.1010632710254415
条件
循环lst列表,取出能整除2的数字
for
循环实现
lst = list(range(10))
l=[]
for x in lst:
if x % 2 == 0:
l.append(x)
print(l)
[2, 4, 6, 8]
大列表解析实现
lst = list(range(10))
print([x for x in lst if x % 2 == 0])
[2, 4, 6, 8]
我们还可以扩展条件,多条件时默认是and
的关系,表达式为 整除2并且大于0
print([x for x in lst if x % 2 == 0 if x > 0])
[2, 4, 6, 8]
多个列表
For循环实现
l1 = [1, 3, 5, 7, 9]
l2 = [0, 2, 4, 6, 8]
l = []
for x in l1:
for y in l2:
l.append((x, y))
print(l)
[(1, 0), (1, 2), (1, 4), (1, 6), (1, 8), (3, 0), (3, 2), (3, 4), (3, 6), (3, 8), (5, 0), (5, 2), (5, 4), (5, 6), (5, 8), (7, 0), (7, 2), (7, 4), (7, 6), (7, 8), (9, 0), (9, 2), (9, 4), (9, 6), (9, 8)]
大列表解析实现
l1 = [1, 3, 5, 7, 9]
l2 = [0, 2, 4, 6, 8]
print([(x, y) for x in l1 for y in l2])
[(1, 0), (1, 2), (1, 4), (1, 6), (1, 8), (3, 0), (3, 2), (3, 4), (3, 6), (3, 8), (5, 0), (5, 2), (5, 4), (5, 6), (5, 8), (7, 0), (7, 2), (7, 4), (7, 6), (7, 8), (9, 0), (9, 2), (9, 4), (9, 6), (9, 8)]
集合解析
print({x for x in range(5)})
返回的是一个集合
{0, 1, 2, 3, 4}
去重
print({x for x in [1, 2, 2, 3, 4, 5]})
{1, 2, 3, 4, 5}
字典解析
基本语法
ret = {exprK:exprV for item in iterator}
小例子
print({k: v for k, v in [('a', 1), ('b', 2)]})