你們好,今天爲你們帶來問我最喜歡的Python推導式使用指南,讓咱們先來看看定義~python
推導式(comprehensions)是Python的一種獨有特性,推導式是能夠從一個數據序列構建另外一個新的數據序列的結構體。通常有三種使用最多的推導式:express
使用推導式能夠簡化代碼的同時提升效率,在個人我的使用場景中,用的最多的仍是列表推導式,接下來我會一一介紹這三種常見的推導式,最後經過一個簡單實戰發現推導式的高效之處segmentfault
模板
首先,讓咱們看看使用列表推導式的基礎模板:數組
簡單來講,遍歷一個list,獲得每個元素item,咱們相對item進行哪些操做,寫在expression裏就能夠,若是對篩選有什麼條件,能夠放在if後面數據結構
下面能夠經過大量實例幫助你們理解app
使用實例
先看第一個小栗子,在這裏咱們用for循環常規遍歷一個字符串‘human’,把每一字母做爲元素放在一個叫h_letters的數組裏面:ui
h_letters = [] for letter in 'human': h_letters.append(letter) print(h_letters) 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執行方式以下:code
咱們能夠在expression的部分進行不少操做,好比:blog
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特性之一,這裏相信聰明的你已經想到了更多用法!
模板
讓咱們看先來看使用字典推導式的基礎模板:
這裏和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
模板
讓咱們看先來看使用集合推導式的基礎模板:
其實集合推導式和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文件下載連接附上,這樣你們若是先要練習能夠自行下載
首先,咱們的初始目錄結構以下:
這裏我新建了一個test文件夾,把dictionary.txt 文件和python文件放在一塊兒方便讀取,開始以前,先大概看下txt文件長什麼樣子:
第一步:讀取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點個贊吧!!