Python学习笔记(14)——列表生成式

本章介绍如何快速生成有序列表。

本文仅供个人记录和复习,不用于其他用途

列表生成式

之前我们讲过range,可以快速生成一个有序列表。但是,如果我们生成不连续的列表呢?我们可以循环:

>>> for x in range(1, 11):
...     L.append(x * x)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

当然,我们会有更简单的方法:

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

可以看出来,我们把下面的语句放到了for循环前面,整个列表生成式会返回一个list。

for后面还可以接判断语句,进一步帮助我们生成我们需要的列表:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

这样我们就筛选出了所有的偶数。当然,如果我们需要生成全排列(具体请看数据结构与算法),那么可以使用双层循环:

>>> [m + n for m in 'abc' for n in 'xyz']
['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']

那么我们可以做一个简单的练习,列出当前目录下所有的文件和目录名:

>>> import os
>>> [d for d in os.listdir('.')]
['def.py', 'def2.py', 'def3.py', 'for.py', 'for2.py', 'HelloName.py', 'HelloWorld.py', 'ifelse.py', 'qiepian.py']

之前我们说过,for循环可以使用两个变量来同时迭代索引和元素:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> for k, v in d.iteritems():
...     print k, '=', v
... 
y = B
x = A
z = C

列表生成式也可以使用两个变量来生成list:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C'}
>>> [k + '=' + v for k, v in d.iteritems()]
['y=B', 'x=A', 'z=C']

这里我们演示用的都是dict,因为dict可以让key和value一一对应,这里我们也知道了如何使用两个变量来获取dict的key和value。