提升逼格的兩個函式
在做 code review 的時候,發現有些同學的程式碼看起來不那麼 pythonic,忍不住寫篇短文介紹兩個函式:setdefault 與 defaultdict。
有這樣的需求,一個列表,裡面是(key, value) 這樣的鍵值對元組,要將它轉換成一個字典物件,並將key相同的value作為一組。看程式碼:
data = [("p", 1), ("p", 2), ("p", 3),
("h", 1), ("h", 2), ("h", 3)]
要轉換成
result = {'p': [1, 2, 3], 'h': [1, 2, 3]}
下面這個方法是大家都能想到的,先判斷result中有沒有key,沒有則為其初始化一個列表,有則直接將value值append到列表中。但這段程式碼在Python中不怎麼優雅
result = {}
for (key, value) in data:
if key in result:
result[key].append(value)
else:
result[key] = [value]
setdefault
更優雅的方式就是使用setdefault方法,它是字典物件的一個例項方法,接收兩個引數,用法和字典的get
方法類似,但是比 get 更強大。 它可以為給字典的key設定一個預設值(如果key不在字典中的時候)
定義
def setdefault(self, k, d=None):
""" D.setdefault(k[,d]) -> D.get(k,d),
also set D[k]=d if k not in D
"""
value = D.get(k,d)
if k not in D:
D[k]=d
return value
當然,內部具體實現肯定比上面的程式碼要高效。二者的區別是:L get 方法設定的預設值不會改變原字典, 而setdefault設定的預設值會改變原字典的值。
>>> d = {"x":3}
>>> y = d.get("y", 4)
>>> y
4
>>> d
{'x': 3}
對比
>>> y = d.setdefault("y", 4)
>>> y
4
>>> d
{'y': 4, 'x': 3}
所以,前面的需求就有了這種更優雅的寫法:
result = {}
data = [("p", 1), ("p", 2), ("p", 3),
("h", 1), ("h", 2), ("h", 3)]
for (key, value) in data:
result.setdefault(key, []).append(value)
defaultdict
defaultdict是屬於collections 模組下的一個工廠函式,用於構建字典物件,接收一個函式(可呼叫)物件為作為引數。引數返回的型別是什麼,key對應value就是什麼型別。
>>> result = defaultdict(list)
>>> result
defaultdict(<type 'list'>, {})
>>> result['a']
[]
引數為 list,它就會構建一個預設value為list的字典,例如result[‘a’]的值預設就是list物件。
因此,前面這段程式碼可以改為:
from collections import defaultdict
result = defaultdict(list)
data = [("p", 1), ("p", 2), ("p", 3),
("h", 1), ("h", 2), ("h", 3)]
for (key, value) in data:
result[key].append(value)
記住了嗎?這兩個函式一定要動手實踐才會變成自己的東西哦。只看不做,徒勞無益
推薦閱讀
相關文章
- 兩個JS之間的函式互相呼叫JS函式
- Vue電商專案-提升逼格玩轉svgVueSVG
- 新手秒懂 - 高逼格解釋變數提升變數
- ton函式函式hash的兩種形式函式
- 科技公司最常用的50款開源工具,提升你的逼格~開源工具
- JS陣列的幾個有逼格操作JS陣列
- 函式的提升與重寫函式
- JS——變數提升和函式提升JS變數函式
- Python 兩個內建函式: locals() 和 globals()Python函式
- 呼叫函式實現兩個數交換函式
- 函式內部的變數提升函式變數
- javascript之變數提升與函式提升JavaScript變數函式
- 深入理解js的變數提升和函式提升JS變數函式
- 兩個需要求 sg 函式的樹上博弈問題函式
- JS 會有變數提升和函式提升JS變數函式
- 深入理解變數提升和函式提升變數函式
- Javascript 函式和變數提升JavaScript函式變數
- Python 函式中引數前面一個和兩個星號(**)的區別Python函式
- 深入淺出JS - 變數提升(函式宣告提升)JS變數函式
- 如何使用OO和函式式兩個方法實現重構? - DZone函式
- 含兩個引數的三元函式的高階偏導數函式
- 關於javascript中變數及函式的提升JavaScript變數函式
- 前端面試題,寫出一個快速找出兩個陣列不同值的函式。前端面試題陣列函式
- Promise 讓你的專案更有逼格Promise
- strcmp()函式,如果兩個字串引數相同,該函式就返回0,否則返回非零值函式字串
- JS變數宣告和函式宣告提升JS變數函式
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- 利用標準I/O函式,實現兩個檔案的複製功能函式
- Python中可迭代物件、迭代器以及iter()函式的兩個用法詳解Python物件函式
- 箭頭函式和普通函式的10個區別函式
- tp5 db函式的兩種區別函式
- 定義函式的兩種形式及區別函式
- 深度掌握 Java Stream 流操作,讓你的程式碼高出一個逼格!Java
- vue在一個函式中呼叫另外一個函式Vue函式
- 設計模式,你相信嗎,只用兩個函式實現事務!設計模式函式
- 不可思議的hexo,五分鐘教你免費搭一個高逼格技術部落格Hexo
- 編寫一個函式,實現兩個整型陣列的合併(將兩個整型陣列a和b合併成一個從小到大有序排列的整形陣列c,並在主函式中測試)。函式陣列
- python 的幾個常用的函式Python函式