第一章:資料結構和演算法

深圳-風塵發表於2018-09-06

第一章:資料結構和演算法

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

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

問題:現在有一個包含 N 個元素的元組或者是序列,怎樣將它裡面的值解壓後同時賦值給 N 個變數?

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

 

1.2解壓可迭代物件賦值給多個變數:

問題:如果一個可迭代物件的元素個數超過變數個數時,會丟擲一個 ValueError 。 那麼怎樣才能從這個可迭代物件中解壓出 N 個元素出來?

解決方案:Python 的星號表示式可以用來解決這個問題

 

1.3保留最後N個元素:

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

解決方案:collections.deque

deque 類可以被用在任何你只需要一個簡單佇列資料結構的場合

 

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

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

解決方案: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 接受多個字典並將它們在邏輯上變為一個字典。

相關文章