
通過代碼實(shí)例展示Python中列表生成式的用法
這篇文章主要介紹了通過代碼實(shí)例展示Python中列表生成式的用法,包括找出質(zhì)數(shù)、算平方數(shù)等基本用法,需要的朋友可以參考下
1 平方列表
如果你想創(chuàng)建一個(gè)包含1到10的平方的列表,你可以這樣做:
squares = []
for x in range(10):
squares.append(x**2)
這是一個(gè)簡單的例子,但是使用列表生成式可以更簡潔地創(chuàng)建這個(gè)列表。
squares = [x**2 for x in range(10)]
這個(gè)最簡單的列表生成式由方括號開始,方括號內(nèi)部先是一個(gè)表達(dá)式,其后跟著一個(gè)for語句。列表生成式總是返回一個(gè)列表。
2 整除3的數(shù)字列表
通常,你可能這樣寫:
numbers = []
for x in range(100):
if x % 3 == 0:
numbers.append(x)
你可以在列表生成式里包含一個(gè)if語句,來有條件地為列表添加項(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ù)
這通常要使用好幾行代碼來實(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)
不過,你可以使用兩個(gè)列表生成式來簡化代碼。
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ù)的列表。通過找出2-7的倍數(shù)來產(chǎn)生這個(gè)非質(zhì)數(shù)列表。然后我們循環(huán)遍歷數(shù)字并查看每個(gè)數(shù)字是否在非質(zhì)數(shù)列表。
修正:正如reddit上的shoyer指出的,使用集合(set)來查找noprimes(代碼里的屬性參數(shù),譯者注)效率更高。由于noprimes應(yīng)該只包含唯一的值,并且我們頻繁地去檢查一個(gè)值是否存在,所以我們應(yīng)該使用集合。集合的使用語法和列表的使用語法類似,所以我們可以這樣使用:
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)對該行的每個(gè)項(xiàng)進(jìn)行迭代。
5 模擬多個(gè)擲硬幣事件
假設(shè)需要模擬多次擲硬幣事件,其中0表示正面,1表示反面,你可以這樣編寫代碼:
from random import random
results = []
for x in range(10):
results.append(int(round(random())))
或者使用列表生成式使代碼更簡潔:
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ù),所以對輸出進(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)
或者你可以使用列表生成式簡化它:
vowels = 'aeiou'
nonvowels = ''.join([l for l in sentence if not l in vowels])
這個(gè)例子使用列表生成式創(chuàng)建一個(gè)字母列表,字母列表的字母來自sentence句子的非元音字母。然后我們把生成的列表傳給join()函數(shù)去轉(zhuǎn)換為字符串。
修正:正如reddit上的iamadogwhatisthis提出的,這個(gè)例子不需要列表生成式。使用生成器(generator)更好:
vowels = 'aeiou'
nonvowels = ''.join(l for l in sentence if not l in vowels)
注意,這里去掉了方括號。這是因?yàn)閖oin函數(shù)接收任意可迭代的數(shù)據(jù),包括列表或者生成器。這個(gè)沒有方括號的語法使用了生成器。這產(chǎn)生(與列表生成式)同樣的結(jié)果,相對于之前把所有條目包裝成一個(gè)列表,生成器在我們遍歷時(shí)才產(chǎn)生相應(yīng)的條目。這可以使我們不必保存整個(gè)列表到內(nèi)存,并且這對于處理大量數(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)
這同樣可以使用列表生成式簡化代碼:
import os
files = [f for f in os.listdir('./my_dir') if f.endswith('.txt')]
或者你可以獲取一個(gè)相對路徑的列表:
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類將會(huì)自動(dòng)地使用csv文件的第一行作為字典的key屬性名。DictReader類返回一個(gè)將會(huì)遍歷csv文件所有行的對象。這個(gè)文件對象通過open()函數(shù)產(chǎn)生。我們提供了open()兩個(gè)參數(shù)–第一個(gè)是csv文件名,第二個(gè)是模式。在這例子,‘rU'有兩個(gè)意思。想往常一樣,‘r'表示以讀模式打開文件?!甎'表明我們將會(huì)接受通用換行符–‘n',‘r'和‘rn'。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10