列表生成式
最近發(fā)現(xiàn)一個(gè)可以快速生成列表的方法,python的列表生成器,即List ComPRehensions,是Python內(nèi)置的非常簡(jiǎn)單卻強(qiáng)大的可以用來(lái)創(chuàng)建list的生成式。
舉個(gè)例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):
>>> range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]但如果要生成[1x1, 2x2, 3x3, …, 10x10]怎么做?方法一是循環(huán):
>>> L = []>>> for x in range(1, 11):... L.append(x * x)...>>> L[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]但是循環(huán)太繁瑣,而列表生成式則可以用一行語(yǔ)句代替循環(huán)生成上面的list:
>>> [x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]寫(xiě)列表生成式時(shí),把要生成的元素x * x放到前面,后面跟for循環(huán),就可以把list創(chuàng)建出來(lái),十分有用,多寫(xiě)幾次,很快就可以熟悉這種語(yǔ)法。
for循環(huán)后面還可以加上if判斷,這樣我們就可以篩選出僅偶數(shù)的平方:
>>> [x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]還可以使用兩層循環(huán),可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']三層和三層以上的循環(huán)就很少用到了。
運(yùn)用列表生成式,可以寫(xiě)出非常簡(jiǎn)潔的代碼。例如,列出當(dāng)前目錄下的所有文件和目錄名,可以通過(guò)一行代碼實(shí)現(xiàn):
>>> import os>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目錄['.SHubClient.py.old.swp', 'cn_query_cache_pb2.py', 'cn_query_cache_pb2.pyc', 'common.py', 'common.pyc', 'Database.py', 'Database.pyc', 'DatabaSEOperation.py']for循環(huán)其實(shí)可以同時(shí)使用兩個(gè)甚至多個(gè)變量,比如dict的iteritems()可以同時(shí)迭代key和value:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> for k, v in d.items():... print k, '=', v... y = Bx = Az = C因此,列表生成式也可以使用兩個(gè)變量來(lái)生成list:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> [k + '=' + v for k, v in d.iteritems()]['y=B', 'x=A', 'z=C']最后把一個(gè)list中所有的字符串變成小寫(xiě):
>>> L = ['Hello', 'World', 'IBM', 'Apple']>>> [s.lower() for s in L]['hello', 'world', 'ibm', 'apple']如果list中既包含字符串,又包含整數(shù),由于非字符串類型沒(méi)有l(wèi)ower()方法,所以列表生成式會(huì)報(bào)錯(cuò):
>>> L = ['Hello', 'World', 18, 'Apple', None]>>> [s.lower() for s in L]Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'int' object has no attribute 'lower'使用內(nèi)建的isinstance函數(shù)可以判斷一個(gè)變量是不是字符串:
>>> x = 'abc'>>> y = 123>>> isinstance(x, str)True>>> isinstance(y, str)False所以將list中的字符串全部變?yōu)樾?xiě)的列表生成式為:
>>> L = ['Hello', 'World', 18, 'Apple', 20]>>> [s.lower() for s in L if isinstance(s,str)]['hello', 'world', 'apple']>>>如果將其中的非字符串也輸出,那么列表生成式為:
>>> L = ['Hello', 'World', 18, 'Apple', 20]>>> [s.lower() if isinstance(s,str) else s for s in L]['hello', 'world', 18, 'apple', 20]>>>運(yùn)用列表生成式,可以快速生成list,可以通過(guò)一個(gè)list推導(dǎo)出另一個(gè)list,而代碼卻十分簡(jiǎn)潔。
新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注