雪花飘落

列表推导式和字典推导式

列表推导式

基本语法

列表的推导式由四部分组成:[表达式 for 循环 if 条件表达式]

1.中括号构建列表

2.for循环

3.if过滤

4.最终表达式

比如一个最简单的推导式:

ls = [i*2 for i in range(5) if i>2]
# ls最后为[6, 8]

执行逻辑是:首先创建一个空列表ls,然后执行循环,在循环里,对满足条件的数据执行表达式运算,然后把运算的结果添加到列表中。

在这个例子中,首先执行循环,然后我们筛选出了i大于2的部分,也就是3和4,接着依据表达式,把i*2的结果,也就是6和8添加到列表中。所以最终的列表是[6,8]

 

关于这几部分,有一些需要注意的点:

1.for循环是可以嵌套的,例如

# 结果为[6, 6, 6, 6, 6, 8, 8, 8, 8, 8]
ls = [i * 2 for i in range(5) for j in range(5) if i > 2]

这样的话,因为内层循环循环了5次,所以6和8会分别添加5次

2.if过滤是可以不写的

3.最终表达式可以是任何Python中合法的表达式,比如函数调用、逻辑表达式、甚至是另外一个列表推导式,例如:

# 结果为[[0, 0, 0], [1, 1, 1], [2, 2, 2]]
ls = [[i for j in range(3)] for i in range(3)]

所以,列表推导式是可以无限套娃的,我们可以利用这一点来快速生成多维列表。

执行效率

from timeit import timeit

code1 = '''
ls = []
for i in range(1000):
    if i%2 == 0:
        ls.append(i)
'''

code2 = 'ls = [i for i in range(1000) if i%2 == 0]'
# 大概是40s(timeit函数会执行多次,取总和)
print(timeit(code1))
# 大概是30s
print(timeit(code2))

生成两个相同的列表,可以发现,列表推导式的执行效率是要优于传统语法的。且列表越长,差距会越明显。

字典推导式

因为列表推导式在嵌套业务逻辑中的可读性和执行效率优秀,所以在Python 2.7版本之后,加入了字典推导式,其基本语法和列表推导式类似:

{键表达式:值表达式 for循环 if过滤}

先看一个例子:

# {0: 9, 1: 9, 2: 9}
dc = {k: v for k in range(3) for v in range(10)}

需要注意,这里的两个循环不是分别对k和v循环,而是一个嵌套循环。所以实际上,这里会生成30个键值对,但是由于键的唯一性,键相同时后续生成的会覆盖之前生成的,所以这里值全部都是9。

如果加上if条件,同样的,这里写的两个条件其实是一个嵌套条件语句。

# 结果为{1: 4, 2: 4}
dc = {k: v for k in range(3) for v in range(10) if v < 5 if k > 0}

一个简单应用,把1-26的数字和a-z的小写字母对应:

dc = {k: chr(ord("a") + k - 1) for k in range(1, 27)}

 

posted @ 2022-10-08 15:44  haruyuki  阅读(244)  评论(0编辑  收藏  举报