第一章:數據結構和算法

第一章:數據結構和算法

介紹:python3-cookbook這本書是高級用法,不是小白使用書
目的:寫做目的是記錄下本身學習這本書的過程以及收穫
書籍地址:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html
html

1.1解壓序列賦值給多個變量:

問題:如今有一個包含 N 個元素的元組或者是序列,怎樣將它裏面的值解壓後同時賦值給 N 個變量?python

解決方案:經過一個簡單的賦值語句解壓並賦值給多個變量。 惟一的前提就是變量的數量必須跟序列元素的數量是同樣的。算法

 

1.2解壓可迭代對象賦值給多個變量:

問題:若是一個可迭代對象的元素個數超過變量個數時,會拋出一個 ValueError 。 那麼怎樣才能從這個可迭代對象中解壓出 N 個元素出來?數據結構

解決方案:Python 的星號表達式能夠用來解決這個問題數據結構和算法

 

1.3保留最後N個元素:

問題:在迭代操做或者其餘操做的時候,怎樣只保留最後有限幾個元素的歷史記錄函數

解決方案:collections.deque學習

deque 類能夠被用在任何你只須要一個簡單隊列數據結構的場合編碼

 

1.4查找最大或最小的N個元素:

問題:怎樣從一個集合中得到最大或者最小的 N 個元素列表?spa

解決方案:heapq 模塊有兩個函數:nlargest() 和 nsmallest() 能夠完美解決這個問題設計

 

1.5實現一個優先級隊列:

問題:怎樣實現一個按優先級排序的隊列? 而且在這個隊列上面每次 pop 操做老是返回優先級最高的那個元素

解決方案:利用 heapq 模塊實現了一個簡單的優先級隊列:

 

1.6字典中的鍵映射多個值:

問題:怎樣實現一個鍵對應多個值的字典(也叫 multidict)?

解決方案:使用 collections 模塊中的 defaultdict 來構造這樣的字典。 defaultdict 的一個特徵是它會自動初始化每一個 key 剛開始對應的值,因此你只須要關注添加元素操做了

 

1.7字典排序:

問題:想建立一個字典,而且在迭代或序列化這個字典的時候可以控制元素的順序。

解決方案:使用 collections 模塊中的 OrderedDict 類

 

1.8字典的運算:

問題:怎樣在數據字典中執行一些計算操做(好比求最小值、最大值、排序等等)?

解決方案:對字典值執行計算操做,一般須要使用 zip() 函數先將鍵和值反轉過來,而後結合max(), min(), sorted()方法實現

 

1.9查找兩字典的相同點:

問題:怎樣在兩個字典中尋尋找相同點(好比相同的鍵、相同的值等等)?

解決方案:在兩字典的 keys() 或者 items() 方法返回結果上執行集合操做

 

1.10刪除序列相同元素並保持順序:

問題:怎樣在一個序列上面保持元素順序的同時消除重複的值?

解決方案:若是序列上的值都是 hashable 類型,那麼能夠很簡單的利用集合或者生成器來解決這個問題。

 

1.11命名切片:

問題:若是你的程序包含了大量沒法直視的硬編碼切片,而且你想清理一下代碼。

解決方案:內置的 slice() 函數建立了一個切片對象。全部使用切片的地方均可以使用切片對象

 

1.12序列中出現次數最多的元素:

問題:怎樣找出一個序列中出現次數最多的元素呢?

解決方案:collections.Counter 類就是專門爲這類問題而設計的, 它甚至有一個有用的 most_common() 方法直接給了答案。

 

1.13經過某個關鍵字排序一個字典列表:

問題:有一個字典列表,想根據某個或某幾個字典字段來排序這個列表。

解決方案:經過使用 operator 模塊的 itemgetter 函數,能夠很是容易的排序這樣的數據結構。

 

1.14排序只支持原生比較的對象:

問題:你想排序類型相同的對象,可是他們不支持原生的比較操做。

解決方案:內置的 sorted() 函數有一個關鍵字參數 key ,能夠傳入一個 callable 對象給它, 這個 callable對象對每一個傳入的對象返回一個值,這個值會被 sorted 用來排序這些對象。

 

1.15經過某個字段將記錄分組:

問題:你有一個字典或者實例的序列,而後你想根據某個特定的字段好比 date 來分組迭代訪問。

解決方案:itertools.groupby() 函數對於這樣的數據分組操做很是實用。 

 

1.16過濾序列元素:

問題:你有一個數據序列,想利用一些規則從中提取出須要的值或者是縮短序列

解決方案:使用列表推導、使用生成器表達式迭代產生過濾的元素

 

1.17從字典中提取子集:

問題:你想構造一個字典,它是另一個字典的子集。

解決方案:字典推導、經過建立一個元組序列而後把它傳給 dict() 函數也能實現

 

1.18映射名稱到序列元素:

問題:你有一段經過下標訪問列表或者元組中元素的代碼,可是這樣有時候會使得你的代碼難以閱讀, 因而你想經過名稱來訪問元素。

解決方案:collections.namedtuple() 函數經過使用一個普通的元組對象來幫你解決這個問題

 

1.19轉換並同時計算數據:

問題:你須要在數據序列上執行彙集函數(好比 sum() , min() , max() ), 可是首先你須要先轉換或者過濾數據

解決方案:一個很是優雅的方式去結合數據計算與轉換就是使用一個生成器表達式參數。 

 

1.20合併多個字典和映射:

問題:如今有多個字典或者映射,你想將它們從邏輯上合併爲一個單一的映射後執行某些操做, 好比查找值或者檢查某些鍵是否存在。

解決方案:使用 collections 模塊中的 ChainMap 類。一個 ChainMap 接受多個字典並將它們在邏輯上變爲一個字典。

相關文章
相關標籤/搜索