通過(guò)代碼實(shí)例展示Python中列表生成式的用法
1 平方列表
如果你想創(chuàng)建一個(gè)包含1到10的平方的列表,你可以這樣做:
squares = [] for x in range(10): squares.append(x**2)
這是一個(gè)簡(jiǎn)單的例子,但是使用列表生成式可以更簡(jiǎn)潔地創(chuàng)建這個(gè)列表。
squares = [x**2 for x in range(10)]
這個(gè)最簡(jiǎn)單的列表生成式由方括號(hào)開(kāi)始,方括號(hào)內(nèi)部先是一個(gè)表達(dá)式,其后跟著一個(gè)for語(yǔ)句。列表生成式總是返回一個(gè)列表。
2 整除3的數(shù)字列表
通常,你可能這樣寫(xiě):
numbers = [] for x in range(100): if x % 3 == 0: numbers.append(x)
你可以在列表生成式里包含一個(gè)if語(yǔ)句,來(lái)有條件地為列表添加項(xiàng)。為了創(chuàng)建一個(gè)包含0到100間能被3整除的數(shù)字列表,可以使用列表推導(dǎo)式:
numbers = [x for x in range(100) if x % 3 == 0]
3 找出質(zhì)數(shù)
這通常要使用好幾行代碼來(lái)實(shí)現(xiàn)。
noprimes = [] for i in range(2, 8): for j in range(i*2, 50, i): noprimes.append(j) primes = [] for x in range(2, 50): if x not in noprimes: primes.append(x)
不過(guò),你可以使用兩個(gè)列表生成式來(lái)簡(jiǎn)化代碼。
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)] primes = [x for x in range(2, 50) if x not in noprimes]
第一行代碼在一個(gè)列表生成式里使用了多層for循環(huán)。第一個(gè)循環(huán)是外部循環(huán),第二個(gè)循環(huán)是是內(nèi)部循環(huán)。為了找到質(zhì)數(shù),我們首先找到一個(gè)非質(zhì)數(shù)的列表。通過(guò)找出2-7的倍數(shù)來(lái)產(chǎn)生這個(gè)非質(zhì)數(shù)列表。然后我們循環(huán)遍歷數(shù)字并查看每個(gè)數(shù)字是否在非質(zhì)數(shù)列表。
修正:正如reddit上的shoyer指出的,使用集合(set)來(lái)查找noprimes(代碼里的屬性參數(shù),譯者注)效率更高。由于noprimes應(yīng)該只包含唯一的值,并且我們頻繁地去檢查一個(gè)值是否存在,所以我們應(yīng)該使用集合。集合的使用語(yǔ)法和列表的使用語(yǔ)法類(lèi)似,所以我們可以這樣使用:
noprimes = set(j for i in range(2, 8) for j in range(i*2, 50, i)) primes = [x for x in range(2, 50) if x not in noprimes]
4 嵌套列表降維
假設(shè)你有一個(gè)列表的列表(列表里包含列表)或者一個(gè)矩陣,
matrix = [[0,1,2,3], [4,5,6,7], [8,9,10,11]]
并且你想把它降維到一個(gè)一維列表。你可以這樣做:
flattened = [] for row in matrix: for i in row: flattened.append(i)
使用列表生成式:
flattened = [i for row in matrix for i in row]
這使用了兩個(gè)for循環(huán)去迭代整個(gè)矩陣。外層(第一個(gè))循環(huán)按行迭代,內(nèi)部(第二個(gè))循環(huán)對(duì)該行的每個(gè)項(xiàng)進(jìn)行迭代。
5 模擬多個(gè)擲硬幣事件
假設(shè)需要模擬多次擲硬幣事件,其中0表示正面,1表示反面,你可以這樣編寫(xiě)代碼:
from random import random results = [] for x in range(10): results.append(int(round(random())))
或者使用列表生成式使代碼更簡(jiǎn)潔:
from random import random results = [int(round(random())) for x in range(10)]
這里使用了range函數(shù)循環(huán)了10次。每一次我們都把random()的輸出進(jìn)行四舍五入。因?yàn)閞andom()函數(shù)返回一個(gè)0到1的浮點(diǎn)數(shù),所以對(duì)輸出進(jìn)行四舍五入就會(huì)返回0或者1。Round()函數(shù)返回一個(gè)浮點(diǎn)型數(shù)據(jù),使用int()將其轉(zhuǎn)為整型并添加到列表里。
6 移除句子中的元音字母
假設(shè)你有一個(gè)句子,
sentence = 'Your mother was a hamster'
并且你想移除所有的元音字母。我們可以使用幾行代碼輕易做到:
vowels = 'aeiou' non_list = [] for l in sentence: if not l in vowels: non_list.append(l) nonvowels = ''.join(non_list)
或者你可以使用列表生成式簡(jiǎn)化它:
vowels = 'aeiou' nonvowels = ''.join([l for l in sentence if not l in vowels])
這個(gè)例子使用列表生成式創(chuàng)建一個(gè)字母列表,字母列表的字母來(lái)自sentence句子的非元音字母。然后我們把生成的列表傳給join()函數(shù)去轉(zhuǎn)換為字符串。
修正:正如reddit上的iamadogwhatisthis提出的,這個(gè)例子不需要列表生成式。使用生成器(generator)更好:
vowels = 'aeiou' nonvowels = ''.join(l for l in sentence if not l in vowels)
注意,這里去掉了方括號(hào)。這是因?yàn)閖oin函數(shù)接收任意可迭代的數(shù)據(jù),包括列表或者生成器。這個(gè)沒(méi)有方括號(hào)的語(yǔ)法使用了生成器。這產(chǎn)生(與列表生成式)同樣的結(jié)果,相對(duì)于之前把所有條目包裝成一個(gè)列表,生成器在我們遍歷時(shí)才產(chǎn)生相應(yīng)的條目。這可以使我們不必保存整個(gè)列表到內(nèi)存,并且這對(duì)于處理大量數(shù)據(jù)更有效率。
7 獲取目錄里的文件名列表
下面的代碼將會(huì)遍歷my_dir目錄下的文件,并在files里追加每個(gè)以txt為后綴的文件名。
import os
files = []
for f in os.listdir('./my_dir'):
if f.endswith('.txt'):
files.append(f)
這同樣可以使用列表生成式簡(jiǎn)化代碼:
import os
files = [f for f in os.listdir('./my_dir') if f.endswith('.txt')]
或者你可以獲取一個(gè)相對(duì)路徑的列表:
import os
files = [os.path.join('./my_dir', f) for f in os.listdir('./my_dir') if f.endswith('.txt')]
感謝reddit上的rasbt提供。
8 將csv文件讀取為字典列表
我們常常需要讀取和處理csv文件的數(shù)據(jù)。處理csv數(shù)據(jù)的一個(gè)最有用的方法就是把它轉(zhuǎn)換為一個(gè)字典列表。
import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
data.append(x)
你可以使用列表生成式快速實(shí)現(xiàn):
import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
DictReader類(lèi)將會(huì)自動(dòng)地使用csv文件的第一行作為字典的key屬性名。DictReader類(lèi)返回一個(gè)將會(huì)遍歷csv文件所有行的對(duì)象。這個(gè)文件對(duì)象通過(guò)open()函數(shù)產(chǎn)生。我們提供了open()兩個(gè)參數(shù)–第一個(gè)是csv文件名,第二個(gè)是模式。在這例子,‘rU'有兩個(gè)意思。想往常一樣,‘r'表示以讀模式打開(kāi)文件?!甎'表明我們將會(huì)接受通用換行符–‘n',‘r'和‘rn'。
感謝reddit上的blacwidonsfw提供。
- python 中的列表生成式、生成器表達(dá)式、模塊導(dǎo)入
- 詳解python列表生成式和列表生成式器區(qū)別
- python用列表生成式寫(xiě)嵌套循環(huán)的方法
- Python列表生成式與生成器操作示例
- Python3中的列表生成式、生成器與迭代器實(shí)例詳解
- python列表生成式與列表生成器的使用
- 淺談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)
- Python中的列表生成式與生成器學(xué)習(xí)教程
- 淺談Python中列表生成式和生成器的區(qū)別
- 在Python中使用列表生成式的教程
- python開(kāi)發(fā)入門(mén)——列表生成式
相關(guān)文章
Python列表推導(dǎo)式,元組推導(dǎo)式,字典推導(dǎo)式,集合推導(dǎo)式
這篇文章主要介紹了Python列表推導(dǎo)式,元組推導(dǎo)式,字典推導(dǎo)式,集合推導(dǎo)式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
Python3 requests文件下載 期間顯示文件信息和下載進(jìn)度代碼實(shí)例
這篇文章主要介紹了Python3 requests文件下載 期間顯示文件信息和下載進(jìn)度代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python?hug庫(kù)構(gòu)建快速可擴(kuò)展的Web API框架使用詳解
這篇文章主要介紹了Python?hug庫(kù)構(gòu)建快速可擴(kuò)展的Web API框架使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02
如何利用python實(shí)現(xiàn)windows的批處理及文件夾操作
最近工作中需要幾個(gè)腳本運(yùn)行其他程序,幾乎像一個(gè)Windows批處理文件,這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)windows的批處理及文件夾操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
python實(shí)現(xiàn)控制臺(tái)打印的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)控制臺(tái)打印的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
python 數(shù)據(jù)的清理行為實(shí)例詳解
這篇文章主要介紹了python 數(shù)據(jù)的清理行為實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07

