你們好,今天我總結一下Python的推導式,首先讓咱們來看定義python
推導式(comprehensions)是Python的一種獨有特性,是能夠從一個數據序列構建另外一個新的數據序列的結構體。通常有三種使用最多的推導式:express
使用推導式能夠簡化代碼的同時提升效率,在個人我的使用場景中,用的最多的仍是列表推導式,接下來我會一一介紹這三種常見的推導式,最後經過一個簡單實戰發現推導式的高效之處數組
模板bash
首先,讓咱們看看使用列表推導式的基礎模板:數據結構
下面能夠經過大量實例幫助你們理解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
咱們能夠在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特性之一,這裏相信聰明的你已經想到了更多用法!
模板
讓咱們看先來看使用字典推導式的基礎模板:
這裏和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文件長什麼樣子: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推導式來實現
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點個贊吧!!