1. 简述
推导式可以用一行代码优雅地代替多行代码,相当于把多层for循环移到一行。
2. 详解
先看下表达方式
a = [i*2 for i in range(30) if i % 3 is 0] # Output: [0, 6, 12, 18, 24, 30, 36, 42, 48, 54] a = [(x,y) for x in [1,2,3] for y in [3,1,4] if x != y] # Output: [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
一行代码包括了多层循环和各种条件,简洁方便。
推导式相当于按顺序把上下文逻辑放在一行,以列表推导式为例,先把最后要添加进列表的变量放在开头,然后依次把循环和条件判断排成一行。
字典同理
a = {'aa':'aaa'} b = {'bb':'bbb'} c = {'cc':'ccc'} d = {'dd':'ddd'} lista = [a,b,c,d] attrs = {k:v for x in lista for k, v in x.items()} attrs = {} for x in lista: for k, v in x.items(): attrs.update({k:v}) print attrs
集合有去重效果
squared = {x**2 for x in [1, 1, 2]} print(squared) # Output: {1, 4}
3. 实例
更复杂的结构道理相同
a = [1,2,3,4] b = [5,6,7,8] c = [1,3,5,7] d = [2,4,6,8] lista = [a,b] listb = [c,d] listc = [a,c] listd = [b,d] liste = [a,d] listf = [b,c] listx = [lista,listb,liste] listy = [listc,listd,listf] total = [listx,listy] att = [w for x in total for y in x for z in y for w in z] print att b = [] for x in total: for y in x: for z in y: for w in z: b.append(w) print b