1. 程式人生 > ><python3-cookbook>第一章:數據結構和算法

<python3-cookbook>第一章:數據結構和算法

tool 排序類 集合 必須 類型 數通 個數 自己 def

第一章:數據結構和算法

介紹:這本書是高級用法,不是小白使用書
目的:寫作目的是記錄下自己學習這本書的過程以及收獲

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

<python3-cookbook>第一章:數據結構和算法