《python筆記》列表生成式

2021-09-01 11:49:02 字數 4041 閱讀 1953

列表生成式(list comprehension)是一種簡化**的優美方法,下面將舉例說明。

1 平方列表

如果你想建立乙個包含1到10的平方的列表,你可以這樣做:

squares = 

for x in range(10):

這是乙個簡單的例子,但是使用列表生成式可以更簡潔地建立這個列表。

squares = [x**2 for x in range(10)]
這個最簡單的列表生成式由方括號開始,方括號內部先是乙個表示式,其後跟著乙個for語句。列表生成式總是返回乙個列表。

2 整除3的數字列表

通常,你可能這樣寫:

numbers = 

for x in range(100):

if x % 3 == 0:

你可以在列表生成式裡包含乙個if語句,來有條件地為列表新增項。為了建立乙個包含0到100間能被3整除的數字列表,可以使用列表推導式:

numbers = [x for x in range(100) if x % 3 == 0]
3 找出質數

這通常要使用好幾行**來實現。

noprimes = 

for i in range(2, 8):

for j in range(i*2, 50, i):

primes =

for x in range(2, 50):

if x not in noprimes:

不過,你可以使用兩個列表生成式來簡化**。

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]

第一行**在乙個列表生成式裡使用了多層for迴圈。第乙個迴圈是外部迴圈,第二個迴圈是是內部迴圈。為了找到質數,我們首先找到乙個非質數的列表。通過找出2-7的倍數來產生這個非質數列表。然後我們迴圈遍歷數字並檢視每個數字是否在非質數列表。

修正:使用集合(set)來查詢noprimes(**裡的屬性引數,譯者注)效率更高。由於noprimes應該只包含唯一的值,並且我們頻繁地去檢查乙個值是否存在,所以我們應該使用集合。集合的使用語法和列表的使用語法類似,所以我們可以這樣使用:

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 巢狀列表降維

假設你有乙個列表的列表(列表裡包含列表)或者乙個矩陣,

matrix = [[0,1,2,3], [4,5,6,7], [8,9,10,11]]
並且你想把它降維到乙個一維列表。你可以這樣做:

flattened = 

for row in matrix:   

for i in row:

使用列表生成式:

flattened = [i for row in matrix for i in row]
這使用了兩個for迴圈去迭代整個矩陣。外層(第乙個)迴圈按行迭代,內部(第二個)迴圈對該行的每個項進行迭代。

5 模擬多個擲硬幣事件

假設需要模擬多次擲硬幣事件,其中0表示正面,1表示反面,你可以這樣編寫**:

from random import random

results =

for x in range(10):

或者使用列表生成式使**更簡潔:

from random import random

results = [int(round(random())) for x in range(10)]

這裡使用了range函式迴圈了10次。每一次我們都把random()的輸出進行四捨五入。因為random()函式返回乙個0到1的浮點數,所以對輸出進行四捨五入就會返回0或者1。round()函式返回乙個浮點型資料,使用int()將其轉為整型並新增到列表裡。

6 移除句子中的母音字母

假設你有乙個句子,

sentence = 'your mother was a hamster'
並且你想移除所有的母音字母。我們可以使用幾行**輕易做到:

vowels = 'aeiou'

non_list =

for l in sentence:

if not l in vowels:

nonvowels = ''.join(non_list)

或者你可以使用列表生成式簡化它:

vowels = 'aeiou'

nonvowels = ''.join([l for l in sentence if not l in vowels])

這個例子使用列表生成式建立乙個字母列表,字母列表的字母來自sentence句子的非母音字母。然後我們把生成的列表傳給join()函式去轉換為字串。

修正:這個例子不需要列表生成式。使用生成器(generator)更好:

vowels = 'aeiou'

nonvowels = ''.join(l for l in sentence if not l in vowels)

注意,這裡去掉了方括號。這是因為join函式接收任意可迭代的資料,包括列表或者生成器。這個沒有方括號的語法使用了生成器。這產生(與列表生成式)同樣的結果,相對於之前把所有條目包裝成乙個列表,生成器在我們遍歷時才產生相應的條目。這可以使我們不必儲存整個列表到記憶體,並且這對於處理大量資料更有效率。

7 獲取目錄裡的檔名列表

下面的**將會遍歷my_dir目錄下的檔案,並在files裡追加每個以txt為字尾的檔名。

import os

files =

for f in os.listdir('./my_dir'):

if f.endswith('.txt'):

這同樣可以使用列表生成式簡化**:

import os

files = [f for f in os.listdir('./my_dir') if f.endswith('.txt')]

或者你可以獲取乙個相對路徑的列表:

import osfiles = [os.path.join('./my_dir', f) for f in os.listdir('./my_dir') if f.endswith('.txt')]
8 將csv檔案讀取為字典列表

我們常常需要讀取和處理csv檔案的資料。處理csv資料的乙個最有用的方法就是把它轉換為乙個字典列表。

import csv

data =

for x in csv.dictreader(open('file.csv', 'ru')):

你可以使用列表生成式快速實現:

mport csv

data = [ x for x in csv.dictreader(open('file.csv', 'ru'))]

dictreader類將會自動地使用csv檔案的第一行作為字典的key屬性名。dictreader類返回乙個將會遍歷csv檔案所有行的物件。這個檔案物件通過open()函式產生。我們提供了open()兩個引數–第乙個是csv檔名,第二個是模式。在這例子,『ru』有兩個意思。想往常一樣,『r』表示以讀模式開啟檔案。『u』表明我們將會接受通用換行符–『n』,『r』和『rn』。

python學習筆記 列表生成式

迭代 iterable 可迭代的 可以for迴圈 s hello for i in s print i from collections import iterable print isinstance 1,int print isinstance 1,iterable print isinstan...

個人筆記 Python 列表與列表生成式

在python語言中,所謂的列表生成式,就是說可以生成list列表的表示式,是python內建的一種強大的功能。1.1 python 列表 list python裡面 表示乙個列表 列表是最常用的python資料型別 建立乙個列表,只要把逗號分隔的不同的資料項使用方括號括起來即可。如下所示 list...

Python 列表生成式

列表生成式即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生成式。舉個例子,要生成list 1,2,3,4,5,6,7,8,9,10 可以用list range 1,11 list range 1,11 1,2,3,4,5,6,7,8,9,10 但...