国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python列表生成式

2019-11-08 18:51:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

列表生成式

最近發(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)潔。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 易门县| 息烽县| 镇沅| 祁连县| 麟游县| 盱眙县| 江陵县| 安陆市| 桦甸市| 静安区| 长岭县| 西吉县| 宾川县| 堆龙德庆县| 南宫市| 临夏县| 宁津县| 潜江市| 徐州市| 淮滨县| 柘荣县| 大悟县| 鸡东县| 且末县| 万宁市| 于田县| 奈曼旗| 公安县| 京山县| 星子县| 成安县| 双流县| 修武县| 化德县| 建水县| 特克斯县| 同江市| 郧西县| 利川市| 陵川县| 安岳县|