Python
内置的非常简单却强大的可以用来创建 list
的生成式。
使用场合
传统方法
1 | L = [] |
列表生成式替代
1 | L = [x * x for x in range(1,11)] |
for
循环后面还可以加上 if
判断,这样我们就可以筛选出仅偶数的平方
1 | L = [[x * x for x in range(1, 11) if x % 2 == 0]] |
还可以使用两层循环,可以生成全排列:
1 | L = [m + n for m in 'ABC' for n in 'XYZ'] |
for
循环其实可以同时使用两个甚至多个变量,比如 dict
的items()
可以同时迭代 key
和 value
1 | d = {'x': 'A', 'y': 'B', 'z': 'C' } |
因此,列表生成式也可以使用两个变量来生成 list
1 | d = {'x': 'A', 'y': 'B', 'z': 'C' } |
if … else
使用列表生成式的时候,有些童鞋经常搞不清楚 if...else
的用法
例如,以下代码正常输出偶数
1 | >>> [x for x in range(1, 11) if x % 2 == 0] |
但是,我们不能在最后的 if
加上 else
1 | >>> [x for x in range(1, 11) if x % 2 == 0 else 0] |
这是因为跟在 for
后面的 if
是一个筛选条件,不能带 else
,否则如何筛选
另一些童鞋发现把 if
写在 for
前面必须加 else
,否则报错
1 | >>> [x if x % 2 == 0 for x in range(1, 11)] |
这是因为 for
前面的部分是一个表达式,它必须根据 x
计算出一个结果。因此,考察表达式:x if x % 2 == 0
,它无法根据 x
计算出结果,因为缺少 else
,必须加上 else
1 | >>> [x if x % 2 == 0 else -x for x in range(1, 11)] |
可见,在一个列表生成式中,for
前面的 if ... else
是表达式,而 for
后面的 if
是过滤条件,不能带 else