列表推导式和字典推导式
列表推导式
基本语法
列表的推导式由四部分组成:[表达式 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)}