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)]})

results matching ""

    No results matching ""