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