小白的Python 學習筆記(八)推導式詳解

什麼是推導式

你們好,今天我總結一下Python的推導式,首先讓咱們來看定義python

推導式(comprehensions)是Python的一種獨有特性,是能夠從一個數據序列構建另外一個新的數據序列的結構體。通常有三種使用最多的推導式:express

  • 列表推導式(list comprehensions)
  • 字典推導式(dict comprehensions)
  • 集合推導式(set comprehensions)

使用推導式能夠簡化代碼的同時提升效率,在個人我的使用場景中,用的最多的仍是列表推導式,接下來我會一一介紹這三種常見的推導式,最後經過一個簡單實戰發現推導式的高效之處數組

列表推導式(list comprehensions)

模板bash

首先,讓咱們看看使用列表推導式的基礎模板:數據結構

  • [ expression for item in list if conditional ] 簡單來講,遍歷一個list,獲得每個元素item,咱們相對item進行哪些操做,寫在expression裏就能夠,若是對篩選有什麼條件,能夠放在if後面

下面能夠經過大量實例幫助你們理解app

使用實例post

先看第一個小栗子,在這裏咱們用for循環常規遍歷一個字符串‘human’,把每一字母做爲元素放在一個叫h_letters的數組裏面:ui

h_letters = []
for letter in 'human':
    h_letters.append(letter)

print(h_letters)![enter image description here](https://user-gold-cdn.xitu.io/2019/6/14/16b55313e2dd1a43?w=404&h=133&f=png&s=31177)

Out:['h', 'u', 'm', 'a', 'n']

複製代碼

若是咱們根據列表推導式的定義模板,能夠簡化以下:spa

h_letters = [ letter for letter in 'human' ]
print( h_letters)

Out: ['h', 'u', 'm', 'a', 'n']
複製代碼

這樣的話便捷了不少,看上去也很容易理解,這裏咱們在expression部分什麼都沒有寫,只是提出了每一個元素而已,運行時的python執行方式以下: 3d

enter image description here

咱們能夠在expression的部分進行不少操做,好比:

h_letters = [ letter.upper() for letter in 'human' ]
print( h_letters)

Out: ['H', 'U', 'M', 'A', 'N']
複製代碼

這樣咱們能夠很容易的實現字母的大小寫轉化

一樣的,咱們能夠在if後面寫出篩選條件,好比這裏,咱們想要提出從-20 ~ 20中全部能被3整除的正數:

result = [num for num in range(-20,20)        
          if num %3==0 and num > 0]   

print(result)       #多個條件能夠用and鏈接

Out: [3, 6, 9, 12, 15, 18]
複製代碼

列表推導式的實際應用場景十分普遍,它和lambda不一樣,是真正好理解,提升效率的python特性之一,這裏相信聰明的你已經想到了更多用法!

字典推導式(dict comprehensions )

模板

讓咱們看先來看使用字典推導式的基礎模板:

  • { key:value for key,value in existing_data_structure }

這裏和list有所不一樣,因位dict裏面有兩個關鍵的屬性,key 和 value,但大同小異,咱們如今的expression部分能夠同時對 key 和 value 進行操做

下面來看最多見的應用

使用實例

首先最實用的功能莫過於能夠實現一個dict的key,value值互換:

person = {'name':'xiaobai','city':'paris'}
person_reverse = {v:k for k,v in person.items()}   #簡單互換key和value的值便可

print(person_reverse)
Out: {'xiaobai': 'name', 'paris': 'city'}
複製代碼

這裏就很是方便了用字典推導式,否則的話若是用for循環,會稍微麻煩一些。 讓咱們再看下一個很巧的例子:

nums = {'a':10,'b':20,'A':5,'B':3,'d':4}
num_frequency  = {k.lower():nums.get(k.lower(),0) + nums.get(k.upper(),0)
     for k in nums.keys() }

print(num_frequency)

Out: {'a': 15, 'b': 23, 'd': 4}
複製代碼

這裏使用的就比較靈活,咱們有一個數據,key是字母的大小寫混在一塊兒,咱們想統計同一個key(大小寫都包括)所對應的數字出現總和,因此在新建的num_frequency 字典用使用了推導式,這裏咱們遍歷的是dict.keys()配合dict.get()方法,固然,若是僅僅是爲了實現這個功能,咱們有更好的辦法,這裏只是爲了介紹推導式

再好比下面的例子:

fruit = ['apple','banana','organge','mango','peach']

fruit_len = {f:len(f) for f in fruit}
print(fruit_len)

Out:{'apple': 5, 'banana': 6, 'organge': 7, 'mango': 5, 'peach': 5}

複製代碼

咱們有一個fruit的list,如今想要獲得每一種水果的單詞長度,就能夠經過圖中所示的方法實現,很是容易

最後再來看一個字典推導式配合枚舉(enumerate)的例子:

fruit = ['apple','organge','banana','mango','peach']

fruit_positon = {v:i for i,v in enumerate(fruit)}
print(fruit_positon)

Out: {'apple': 0, 'organge': 1, 'banana': 2, 'mango': 3, 'peach': 4}

複製代碼

仍是用剛纔的list,此次咱們獲得的key是fruit的每一個元素,value則是該元素在fruit所在的index

集合推導式(Set comprehensions)

模板

讓咱們看先來看使用集合推導式的基礎模板:

  • { expression for item in Sequence if conditional }

其實集合推導式和list的推導式很像,可是既然是集合,確定會配合利用Set的特有屬性來實現咱們的目的,若是你還對Set這種數據結構不夠了解,能夠參考我以前的文章:Python 進階之路 (四) 先立Flag, 社區最全的Set用法集錦

下面來看最多見的應用

使用實例

首先,咱們來看一個根據Set值惟一的特性的例子,咱們有一個list叫names,用來存儲名字,其中的數據很不規範,有大寫,小寫,還有重複的,咱們想要去重並把名字的格式統一爲首字母大寫,實現方法即是用Set推導式:

names = [ 'Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob','JAMES','jAMeS' ]
names_standard = { n[0].upper()+n[1:].lower() for n in names}

print(names_standard)
Out: {'John', 'Bob', 'James', 'Alice'}

複製代碼

這裏就再也不舉不少的其餘例子了,由於使用的方式多種多樣,剩下的就靠廣大人民羣衆的智慧自行開發便可!

簡單實戰

如今讓咱們來看一個比較綜合的例子!咱們如今手裏有一個英文字典的dictionary.txt文件,包含從A~Z的單詞

具體需求:咱們想要找到長度大於5的正反拼寫都具備實際含義的單詞

咱們如今會經過各類推導式來實現這個目標,我會在文章最後把txt文件及Python文件下載連接附上,這樣你們若是先要練習能夠自行下載

首先,咱們的初始目錄結構以下:

enter image description here
這裏我新建了一個test文件夾,把dictionary.txt 文件和python文件放在一塊兒方便讀取,開始以前,先大概看下txt文件長什麼樣子:

enter image description here

第一步:讀取dictionary.txt中的單詞,選出長度大於5的

with open('dictionary.txt') as dictionary_file:
    words = (line.rstrip() for line in dictionary_file)
    words_over_five_letters = [w for w in words if len(w)>5 ]
    
複製代碼

這裏經過列表推導式words_over_five_letters 用來存儲全部長度大於5的單詞

第二步:將上一步選出的單詞所有以倒序的方式存儲在一個集合裏

reversed_words ={
    word[::-1]
    for word in words_over_five_letters
    }
複製代碼

經過set推導式來實現

第三步:經過 if 條件篩選得出結果

reversible_words = [
    word
    for word in words_over_five_letters
    if word in reversed_words
]

for word in reversible_words[0:20]:
    print(word)
    
    
Out:
    abrood
    agenes
    amaroid
    amunam
    animal
    animes
    bruted
    darter
    decart
    decurt
    deedeed
    deflow
    degami
    degener
    degged
    deified
    deifier
    deliver
    denier
複製代碼

這裏最後共有203個結果,咱們只看了前20個,驗證方法就是隻要長度大於5的單詞同時存在於reversed_words和words_over_five_letters便可

完整代碼以下:

with open('dictionary.txt') as dictionary_file:
    words = (line.rstrip() for line in dictionary_file)
    words_over_five_letters = [w for w in words if len(w)>5 ]

reversed_words ={
    word[::-1]
    for word in words_over_five_letters
     }

reversible_words = [
    word
    for word in words_over_five_letters
    if word in reversed_words
]

for word in reversible_words[0:20]:
    print(word)
複製代碼

資料下載

總結

此次爲你們總結了python裏面常見的三種推導式相關用法以及最後的小實戰環節,但願你們喜歡,雙擊666點個贊吧!!

相關文章
相關標籤/搜索