python输出键值列表_Python 键值分组或分区数据
Python 使用鍵值分組或者分區數據,對分組后的數據做何種歸約是沒有限制的。數據中可能包含一些自變量或者因變量。可以通過自變量對數據進行分區,然后計算每個分區的各項匯總值,包括最大值、最小值、平均值以及標準差等。
對數據做復雜歸約的關鍵是保存每組中的所有數據。Counter函數僅收集相同數據出現的頻次,我們需要基于鍵值將原始數據轉換為序列。
簡而言之,每個5海里的箱子中都保存了該范圍內路徑段的所有數據,而不僅僅是出現次數。不妨將分區看作遞歸,或者defaultdict(list)對象的有狀態應用,下面介紹groupby()函數的遞歸定義,它相對簡單一些。
顯然,groupby(C, key)函數對空集合C的返回值是空字典dict(),或者一般而言,空defaultdict(list)對象。
對于非空集合,首先處理集合頭部C[0],然后遞歸處理集合尾部C[1:]。可以使用head, *tail = C來提取集合的頭部和尾部,如下所示:
下面用dict[key(head)].append(head)將頭部元素放入結果字典中,然后用groupby (tail, key)方法處理剩余數據。
如下所示創建函數:
內部函數group_into()實現了核心的遞歸定義部分,當集合collection為空時返回輸入的字典參數。非空集合則分成頭部和尾部,頭部用于更新字典,尾部包含所有剩余元素,以遞歸方式更新字典。
類型標示區分了數據源類型S_和鍵類型K_。作為key參數的函數必須接收S_類型的參數,返回K_類型的值。前面很多例子都包含了從Leg對象中取出距離的函數。套用Callable[[S_], K_],數據源類型S_是Leg,鍵類型K_是float。
這里不能用Python的默認參數將上面的函數簡化為簡單函數,例如下面的實現方法不可取:
這樣寫的話,對group_by()函數的所有調用都將使用同一個defaultdict(list)對象。Python只創建一次默認值,用可變對象做默認值,其行為往往不符合開發者的預期。這里選用嵌套函數作為實現方案,而沒有使用不可變的默認參數(例如None)結合復雜的邏輯判斷來實現。用外層包裝函數初始化內嵌函數的參數。
下面對距離數據進行分組:
首先定義了一個簡單且可復用的匿名函數,將距離數據按照5海里進行分箱,然后利用該匿名函數對數據進行分組。
檢查分箱后的數據,如下所示:
輸出結果如下:
或者用迭代方法實現partition()函數,如下所示:
進行尾調用優化時,命令式實現的核心部分與遞歸定義是一致的。前面已經分析了這行代碼,保證改寫后的輸出與之前一樣。其余部分作為解決Python遞歸限制的常規編程實踐,與之前的尾調用優化實現是一致的。
類型標示區分了數據源類型S_和鍵類型K_。請注意,defaultdict(list)的返回值要用Dict[K_, List[S_]]標示協助mypy工具確認代碼正常運行,否則會返回錯誤信息:error: Need type annotation for variable。defaultdict可以包含任何類型組合,如果沒有類型標示,將無法確認是否使用了正確的類型。
也可以把這里的類型標示寫成注釋的形式,如下所示:
低版本的pylint工具要求必須這樣寫,因此推薦使用1.8及之后的版本。
總結
以上是生活随笔為你收集整理的python输出键值列表_Python 键值分组或分区数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cubemx 读卡器_cubeMX 之
- 下一篇: opencv 手部识别_手势识别结合到V