通過代碼執行個體展示Python中列表產生式的用法_python

來源:互聯網
上載者:User

1 平方列表

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

squares = []for x in range(10): squares.append(x**2)

 

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

squares = [x**2 for x in range(10)]

這個最簡單的列表產生式由方括弧開始,方括弧內部先是一個運算式,其後跟著一個for語句。列表產生式總是返回一個列表。

2 整除3的數字列表

通常,你可能這樣寫:

numbers = []for x in range(100): if x % 3 == 0:  numbers.append(x)

你可以在列表產生式裡包含一個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):  noprimes.append(j)primes = []for x in range(2, 50): if x not in noprimes:  primes.append(x)

不過,你可以使用兩個列表產生式來簡化代碼。

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的倍數來產生這個非質數列表。然後我們迴圈遍曆數字並查看每個數字是否在非質數列表。

修正:正如reddit上的shoyer指出的,使用集合(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.append(i)

使用列表產生式:

flattened = [i for row in matrix for i in row]

這使用了兩個for迴圈去迭代整個矩陣。外層(第一個)迴圈按行迭代,內部(第二個)迴圈對該行的每個項進行迭代。

5 類比多個擲硬幣事件

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

from random import randomresults = []for x in range(10): results.append(int(round(random())))

或者使用列表產生式使代碼更簡潔:

from random import randomresults = [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:  non_list.append(l)nonvowels = ''.join(non_list)

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

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

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

修正:正如reddit上的iamadogwhatisthis提出的,這個例子不需要列表產生式。使用產生器(generator)更好:

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

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

 7 擷取目錄裡的檔案名稱列表

下面的代碼將會遍曆my_dir目錄下的檔案,並在files裡追加每個以txt為尾碼的檔案名稱。

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

這同樣可以使用列表產生式簡化代碼:

import osfiles = [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')]

感謝reddit上的rasbt提供。

8 將csv檔案讀取為字典列表

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

import csvdata = []for x in csv.DictReader(open('file.csv', 'rU')): data.append(x)

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

import csvdata = [ x for x in csv.DictReader(open('file.csv', 'rU'))]

DictReader類將會自動地使用csv檔案的第一行作為字典的key屬性名稱。DictReader類返回一個將會遍曆csv檔案所有行的對象。這個檔案對象通過open()函數產生。我們提供了open()兩個參數–第一個是csv檔案名稱,第二個是模式。在這例子,‘rU'有兩個意思。想往常一樣,‘r'表示以讀模式開啟檔案。‘U'表明我們將會接受通用分行符號–‘n',‘r'和‘rn'。

感謝reddit上的blacwidonsfw提供。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.