歡迎光臨
每天分享高質量文章

提升逼格的兩個Python函式

導讀:在做 code review 的時候,發現有些同學的程式碼看起來不那麼 pythonic,忍不住寫篇短文介紹兩個函式:setdefault 與 defaultdict。

作者:志軍100

來源:Python之禪(ID:VTtalk)

有這樣的需求,一個串列,裡面是(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]

01 setdefault

更優雅的方式就是使用setdefault方法,它是字典物件的一個實體方法,接收兩個引數,用法和字典的get方法類似,但是比 get 更強大。 它可以為給字典的key設定一個預設值(如果key不在字典中的時候):

1. 定義

 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}

2. 對比

>>> 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)

02 defaultdict

defaultdict是屬於collections 模組下的一個工廠函式,用於構建字典物件,接收一個函式(可呼叫)物件為作為引數。引數傳回的型別是什麼,key對應value就是什麼型別。

>>> result = defaultdict(list)
>>> result
defaultdict('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)

記住了嗎?這兩個函式一定要動手實踐才會變成自己的東西哦。只看不做,徒勞無益。

據統計,99%的大咖都完成了這個神操作


猜你想看

Q: 你的程式碼夠Pythonic嗎

歡迎留言與大家分享

覺得不錯,請把這篇文章分享給你的朋友

轉載 / 投稿請聯絡:baiyu@hzbook.com

更多精彩,請在後臺點選“歷史文章”檢視

贊(0)

分享創造快樂