天天看點

《Python Cookbook(第3版)中文版》——1.15 根據字段将記錄分組

本節書摘來自異步社群《python cookbook(第3版)中文版》一書中的第1章,第1.15節,作者[美]david beazley , brian k.jones,陳舸 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

有一系列的字典或對象執行個體,我們想根據某個特定的字段(比如說日期)來分組疊代資料。

itertools.groupby()函數在對資料進行分組時特别有用。為了說明其用途,假設有如下的字典清單:

現在假設想根據日期以分組的方式疊代資料。要做到這些,首先以目标字段(在這個例子中是date)來對序列排序,然後再使用itertools.groupby()。

這會産生如下的輸出:

函數groupby()通過掃描序列找出擁有相同值(或是由參數key指定的函數所傳回的值)的序列項,并将它們分組。groupby()建立了一個疊代器,而在每次疊代時都會傳回一個值(value)和一個子疊代器(sub_iterator),這個子疊代器可以産生所有在該分組内具有該值的項。

在這裡重要的是首先要根據感興趣的字段對資料進行排序。因為groupby()隻能檢查連續的項,不首先排序的話,将無法按所想的方式來對記錄分組。

如果隻是簡單地根據日期将資料分組到一起,放進一個大的資料結構中以允許進行随機通路,那麼利用defaultdict()建構一個一鍵多值字典(multidict,見1.6節)可能會更好。例如:

這使得我們可以友善地通路每個日期的記錄,如下所示:

對于後面這個例子,我們并不需要先對記錄做排序。是以,如果不考慮記憶體方面的因素,這種方式會比先排序再用groupby()疊代要來的更快。