在Python中使用列表生成式的教程
列表生成式即List Comprehensions,是Python內(nèi)置的非常簡(jiǎn)單卻強(qiáng)大的可以用來創(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)太繁瑣,而列表生成式則可以用一行語句代替循環(huán)生成上面的list:
>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
寫列表生成式時(shí),把要生成的元素x * x放到前面,后面跟for循環(huán),就可以把list創(chuàng)建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。
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)用列表生成式,可以寫出非常簡(jiǎn)潔的代碼。例如,列出當(dāng)前目錄下的所有文件和目錄名,可以通過一行代碼實(shí)現(xiàn):
>>> import os # 導(dǎo)入os模塊,模塊的概念后面講到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目錄
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']
for循環(huán)其實(shí)可以同時(shí)使用兩個(gè)甚至多個(gè)變量,比如dict的iteritems()可以同時(shí)迭代key和value:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> for k, v in d.iteritems():
... print k, '=', v
...
y = B
x = A
z = C
因此,列表生成式也可以使用兩個(gè)變量來生成list:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.iteritems()]
['y=B', 'x=A', 'z=C']
最后把一個(gè)list中所有的字符串變成小寫:
>>> L = ['Hello', 'World', 'IBM', 'Apple'] >>> [s.lower() for s in L] ['hello', 'world', 'ibm', 'apple']
小結(jié)
運(yùn)用列表生成式,可以快速生成list,可以通過一個(gè)list推導(dǎo)出另一個(gè)list,而代碼卻十分簡(jiǎn)潔。
思考:如果list中既包含字符串,又包含整數(shù),由于非字符串類型沒有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
請(qǐng)修改列表生成式,通過添加if語句保證列表生成式能正確地執(zhí)行。
相關(guān)文章
xshell會(huì)話批量遷移到mobaxterm的工具(python小工具)
這篇文章主要介紹了xshell會(huì)話批量遷移到mobaxterm的工具,使用方法也超級(jí)簡(jiǎn)單,本文通過python代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Python的pandas類庫結(jié)構(gòu)參數(shù)
pandas是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的,Pandas 納入了大量庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具,需要的朋友可以參考下2023-07-07
詳解在Python的Django框架中創(chuàng)建模板庫的方法
這篇文章主要介紹了在Python的Django框架中創(chuàng)建模板庫的方法,模版庫通常用來管理單獨(dú)的Django中的應(yīng)用,需要的朋友可以參考下2015-07-07
python?pandas分割DataFrame中的字符串及元組的方法實(shí)現(xiàn)
本文主要介紹了python?pandas分割DataFrame中的字符串及元組的方法實(shí)現(xiàn),主要介紹了3種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03
python關(guān)閉windows進(jìn)程的方法
這篇文章主要介紹了python關(guān)閉windows進(jìn)程的方法,涉及Python調(diào)用系統(tǒng)命令操作windows進(jìn)程的技巧,需要的朋友可以參考下2015-04-04
Python基于鏈接表實(shí)現(xiàn)無向圖最短路徑搜索
鏈接表的存儲(chǔ)相比較鄰接炬陣,使用起來更方便,對(duì)于空間的使用是剛好夠用原則,不會(huì)產(chǎn)生太多空間浪費(fèi)。所以本文將以鏈接表方式實(shí)現(xiàn)無向圖最短路徑搜索,需要的可以參考一下2022-04-04

