列表生成式:
列表生成式就即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']