這些很好用卻不被看好的Python庫,你知道多少?
生活中,常常有一些人,明明很有能力,卻不被身邊人看好。
是金子總能發(fā)光,這句話放在現(xiàn)實(shí)生活中,其實(shí)并不完全適用,人口眾多,不乏有才之人,想要成功就需要一個(gè)一鳴驚人的機(jī)會(huì)。
Python也是。
Python中有很多現(xiàn)成的性能不錯(cuò)的庫。collections就是其中一個(gè)。
collections模塊提供了“高性能的容器數(shù)據(jù)類型”,是通用容器字典、列表、集合和元組的完美替代。
但卻常常被人忽視或者看輕。
今天,小芯就將努力當(dāng)一個(gè)“好伯樂”,簡潔明了地為大家介紹那些不被看好的Python庫,發(fā)掘出它們的無限潛能。
在本文中將會(huì)向讀者仔細(xì)介紹其中的三種數(shù)據(jù)類型,相信在閱讀完本文后,大家一定會(huì)疑惑自己之前是如何在沒有這些庫的情況下完成編程。
Counter
Counter的名字很貼切——它的主要功能就是計(jì)數(shù)。這聽起來很簡單,但事實(shí)證明,數(shù)據(jù)科學(xué)家經(jīng)常不得不進(jìn)行計(jì)數(shù),所以它十分有效。
有幾種方法可以實(shí)現(xiàn)初始化,但筆者通常會(huì)設(shè)置一個(gè)如下圖的值列表:
- from collections import Counter
- ages = [22, 22, 25, 25, 30, 24, 26, 24, 35, 45, 52, 22, 22, 22, 25, 16, 11, 15, 40, 30]
- value_counts = Counter(ages)
- print(value_counts.most_common())
counter.py hosted with ❤ by GitHub
如果讀者要運(yùn)行上述代碼(建議使用這個(gè)高效率工具),就會(huì)得到以下輸出:
- [(22, 5), (25, 3), (24, 2), (30,2), (35, 1), (40, 1), (11, 1), (45, 1), (15, 1), (16, 1), (52, 1), (26, 1)]
按最常見的順序排列的元組列表,其中元組中首先包含值,然后是計(jì)數(shù)。所以可以迅速地從中看到22歲是最常見的年齡,頻率為5次,還有年齡只出現(xiàn)了一次。完成了!
DefaultDict
這是筆者的最愛之一。DefaultDict是在首次遇到每個(gè)鍵時(shí)使用默認(rèn)值初始化的多功能字典。接下來是一個(gè)實(shí)例。
- From collections import defaultdict
- my_default_dict = defaultdict(int)
- for letter in'the red fox ran as fast as it could':
- my_default_dict[letter] +=1
- print(my_default_dict)
defaultdict.py hosted with ❤ by GitHub
返回
- defaultdict(<type 'int'>,{'a': 4, ' ': 8, 'c': 1, 'e': 2, 'd': 2, 'f': 2, 'i': 1, 'h': 1, 'l': 1, 'o':2, 'n': 1, 's': 3, 'r': 2, 'u': 1, 't': 3, 'x': 1})
通常,當(dāng)嘗試訪問一個(gè)不在字典中的值時(shí),就會(huì)出現(xiàn)顯示錯(cuò)誤的界面。還有其他方法可以處理這個(gè)問題,但是它會(huì)添加一些多余的代碼當(dāng)用戶希望使用默認(rèn)值的時(shí)候。在上面的例子中,用int初始化了defauldict,這意味著在第一次訪問時(shí),將它假設(shè)為0,所以可以很容易地對(duì)所有字符進(jìn)行計(jì)數(shù),簡潔明了。另一個(gè)常見的初始化是list,它允許用戶在第一次訪問時(shí)立即開始附加值。
NamedTuple
NamedTuple對(duì)于數(shù)據(jù)科學(xué)家的意義至關(guān)重要。接下來這個(gè)場(chǎng)景聽起來可能十分熟悉, 由于喜歡list,所以正在進(jìn)行特征工程,只需將這些特征添加到相對(duì)應(yīng)的類中,然后將其輸入到機(jī)器學(xué)習(xí)模型中。當(dāng)?shù)玫綌?shù)百個(gè)特征時(shí),情況就會(huì)變得十分混亂。對(duì)于具體用到的特性,或引用了列表中的哪個(gè)索引模棱兩可。更糟糕的是,當(dāng)其他人查看代碼時(shí),他們面對(duì)這一大堆的特性根本無從下手。
輸入NamedTuples來解決這個(gè)窘境。
僅僅只需要多寫幾行代碼,混亂的列表立刻就會(huì)恢復(fù)秩序。如下圖所示:
- from collections import namedtuple
- Features = namedtuple('Features', ['age', 'gender', 'name'])
- row = Features(age=22, gender='male', name='Alex')
- print(row.age)
namedtuple.py hosted with ❤ by GitHub
如果要運(yùn)行這段代碼,它就會(huì)印出“22”的字樣,即特征用戶存儲(chǔ)在行中的年齡。簡直不可思議!現(xiàn)在,大可不必使用索引來訪問,取而代之的是一些易于理解的名稱,這大大提高了代碼的可維護(hù)性和整潔度。
這些功能都有助于編寫更加簡潔的代碼。
看到這里,讀者應(yīng)該對(duì)collections庫和它的一些很棒的功能有了一些了解,趕緊使用起來吧!
你會(huì)驚訝地發(fā)現(xiàn)它們很多隱藏的用處,以及它給你的代碼帶來的質(zhì)的改變。
盡情享受它們帶來的便利!
動(dòng)動(dòng)你的小手手,一起來試試吧~