[推导式] 一招理解python列表/字典/集合推导式
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}
文件遍历
for (root, dirs, files) in os.walk("./"): for filename in files: src = os.path.join(root,filename) xx = [os.path.join(root,filename) for (root, dirs, files) in os.walk("./") for filename in files]
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
-- 不加思考的复制粘贴是在浪费别人的生命 --

浙公网安备 33010602011771号