一文詳解Python如何優(yōu)雅地對數(shù)據(jù)進(jìn)行分組
假設(shè)我們有這樣一種數(shù)據(jù):
data?=?[ ????("apple",?30),?("apple",?35), ????("apple",?32),?("pear",?60), ????("pear",?32),?("pear",?60), ????("banana",?102),?("banana",?104) ] #?我們希望變成如下格式 """ [('apple',?[30,?35,?32]),? ?('pear',?[60,?32,?60]),? ?('banana',?[102,?104])] """
如果是你的話,你會怎么做呢?很容易想到的一種解決方案是構(gòu)造一個字典:
data?=?[ ????("apple",?30),?("apple",?35), ????("apple",?32),?("pear",?60), ????("pear",?32),?("pear",?60), ????("banana",?102),?("banana",?104) ] data_dict?=?{} for?name,?count?in?data: ????if?name?not?in?data_dict: ????????data_dict[name]?=?[] ????data_dict[name].append(count) print(data_dict) """ {'apple':?[30,?35,?32],? ?'pear':?[60,?32,?60],? ?'banana':?[102,?104]} """ print(list(data_dict.items())) """ [('apple',?[30,?35,?32]),? ?('pear',?[60,?32,?60]),? ?('banana',?[102,?104])] """
這種方案完全沒有問題,不過我們還可以寫的更優(yōu)雅一些,也就是使用字典的 setdefault 方法:
data?=?[ ????("apple",?30),?("apple",?35), ????("apple",?32),?("pear",?60), ????("pear",?32),?("pear",?60), ????("banana",?102),?("banana",?104) ] data_dict?=?{} for?name,?count?in?data: ????#?setdefault(k,?v)?含義如下 ????#?當(dāng)?k?不存在時,將?k:?v?設(shè)置在字典中,并返回?v ????#?當(dāng)?k?存在時,直接返回?k?對應(yīng)值 ????data_dict.setdefault(name,?[]).append(count) print(list(data_dict.items())) """ [('apple',?[30,?35,?32]),? ?('pear',?[60,?32,?60]),? ?('banana',?[102,?104])] """
setdefault 是一個非常方便的方法,但是使用頻率卻不怎么高,或者說該方法不太讓人喜歡。主要是每次調(diào)用都要給一個初始值,比如代碼中的空列表 []。另外這里的初始值可以任意,如果你希望添加的時候還能實現(xiàn)去重效果,那么就將空列表換成空集合即可。
或者我們還可以使用 defaultdict,它位于 collections 模塊中。
from?collections?import?defaultdict data?=?[ ????("apple",?30),?("apple",?35), ????("apple",?32),?("pear",?60), ????("pear",?32),?("pear",?60), ????("banana",?102),?("banana",?104) ] #?里面接收一個?callable #?當(dāng)訪問的?k?不存在時,返回?callable?調(diào)用之后的值 data_dict1?=?defaultdict(list) for?name,?count?in?data: ????data_dict1[name].append(count) print(list(data_dict1.items())) """ [('apple',?[30,?35,?32]),? ?('pear',?[60,?32,?60]),? ?('banana',?[102,?104])] """ #?也可以指定為?set data_dict2?=?defaultdict(set) for?name,?count?in?data: ????data_dict2[name].add(count) print(list(data_dict2.items())) """ [('apple',?{32,?35,?30}),? ?('pear',?{32,?60}),? ?('banana',?{104,?102})] """
總的來說,defaultdict 和字典的 setdefault 方法非常類似,我們使用 setdefault 即可。
當(dāng)然啦,關(guān)于分組,還有一種特殊情況,就是詞頻統(tǒng)計。假設(shè)我們想統(tǒng)計可迭代對象中,每個元素出現(xiàn)的次數(shù)該怎么做呢?
data?=?["apple",?"apple",?"apple", ????????"pear",?"pear",?"pear", ????????"banana",?"banana"] data_dict?=?{} for?item?in?data: ????#?此處不能使用?setdefault,因為它是函數(shù) ????#?.setdefault(item,?0)?+=?1?是不符合語法規(guī)則的 ????if?item?not?in?data_dict: ????????data_dict[item]?=?0 ????data_dict[item]?+=?1 print(data_dict) """ {'apple':?3,?'pear':?3,?'banana':?2} """ #?或者使用?defaultdict from?collections?import?defaultdict data_dict?=?defaultdict(int) for?item?in?data: ????data_dict[item]?+=?1 print(data_dict) """ defaultdict(<class?'int'>,? ????????????{'apple':?3,?'pear':?3,?'banana':?2}) """
然而說到詞頻統(tǒng)計,我們還可以使用 collections 下的 Counter 類。
from?collections?import?Counter data?=?["apple",?"apple",?"apple", ????????"pear",?"pear",?"pear", ????????"banana",?"banana"] data_dict?=?Counter(data) #?直接搞定,Counter?已經(jīng)包含了我們之前的邏輯 print(data_dict) """ Counter({'apple':?3,?'pear':?3,?'banana':?2}) """ #?Counter?繼承?dict,除了支持字典操作之外 #?還提供了很多其它操作,其中一個就是?most_common #?用于選擇出現(xiàn)頻率最高的幾個元素 print(data_dict.most_common(2)) """ [('apple',?3),?('pear',?3)] """
還是很簡單的。
到此這篇關(guān)于一文詳解Python如何優(yōu)雅地對數(shù)據(jù)進(jìn)行分組的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)分組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)實現(xiàn)優(yōu)先級隊列的方法示例
這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)實現(xiàn)優(yōu)先級隊列的方法,結(jié)合實例形式分析了Python中基于給定優(yōu)先級進(jìn)行隊列元素排序的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02python神經(jīng)網(wǎng)絡(luò)Densenet模型復(fù)現(xiàn)詳解
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Densenet模型復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python基于socket實現(xiàn)的UDP及TCP通訊功能示例
這篇文章主要介紹了python基于socket實現(xiàn)的UDP及TCP通訊功能,結(jié)合實例形式分析了基于Python socket模塊的UDP及TCP通信相關(guān)客戶端、服務(wù)器端實現(xiàn)技巧,需要的朋友可以參考下2019-11-11