列表生成式:

列表生成式就即List Compenhensions,是Python内置的非常简单但强大到可以创建list的生成式。

举个例子:要生成list[1,2,3,4,5,6,7,8,9,10]可以用list(range(1,11)):

>>>list(range(1,11))

[1,2,3,4,5,6,7,8,9,10]

但是,如果要生成[1*1,2*2,3*3,4*4,...10*10],方法是循环:
>>>L =[]

>>>for x in range(1,11):

...    L.append(x*x)

...

>>>L

[1,4,9,16,...100]

但是循环太繁琐,而列表生成式则可以用一行语句循环生成上面的list:

>>>[x*x for x in range(1,11)]

[1,4,9,16,...100]

写列表生成式的时候,x*x在前,后面跟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('.')]

['.idlerc', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Favorites', 'IntelGraphicsProfiles', 'Links', 'Local Settings', 'Music', 'My Documents', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{53d200f2-a755-11e5-9222-8b4164f50718}.TM.blf', 'NTUSER.DAT{53d200f2-a755-11e5-9222-8b4164f50718}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{53d200f2-a755-11e5-9222-8b4164f50718}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'OneDrive', 'Pictures', 'PrintHood', 'Recent', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'Videos', '「开始」菜单']

for 循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:
>>>d ={'x':'A','y':'B','z':'C'}

for k,v in d.items():
...    print(k, '=',v)

y = B

x = A

z = C

因此,列表生成式也可以使用两个变量生成list:
>>>d ={'x':'A','y':'B','z':'C'}

>>>[k + '=' + v for k,v in d.items()]

['y = B','x = A','z =C']

最后把一个list中的所有字符串变成小写:
>>>L =['Hello','World','IBM','Apple']

>>>[s.lower() for s in L]

['hello','world','ibm','apple']