人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

一文詳解Python如何優(yōu)雅地對(duì)數(shù)據(jù)進(jìn)行分組

發(fā)布日期:2022-07-20 19:40 | 文章來(lái)源:gibhub

假設(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])]
"""

如果是你的話(huà),你會(huì)怎么做呢?很容易想到的一種解決方案是構(gòu)造一個(gè)字典:

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])]
"""

這種方案完全沒(méi)有問(wèn)題,不過(guò)我們還可以寫(xiě)的更優(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?不存在時(shí),將?k:?v?設(shè)置在字典中,并返回?v
????#?當(dāng)?k?存在時(shí),直接返回?k?對(duì)應(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 是一個(gè)非常方便的方法,但是使用頻率卻不怎么高,或者說(shuō)該方法不太讓人喜歡。主要是每次調(diào)用都要給一個(gè)初始值,比如代碼中的空列表 []。另外這里的初始值可以任意,如果你希望添加的時(shí)候還能實(shí)現(xiàn)去重效果,那么就將空列表?yè)Q成空集合即可。

或者我們還可以使用 defaultdict,它位于 collections 模塊中。

from?collections?import?defaultdict
data?=?[
????("apple",?30),?("apple",?35),
????("apple",?32),?("pear",?60),
????("pear",?32),?("pear",?60),
????("banana",?102),?("banana",?104)
]
#?里面接收一個(gè)?callable
#?當(dāng)訪(fǎng)問(wèn)的?k?不存在時(shí),返回?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})]
"""

總的來(lái)說(shuō),defaultdict 和字典的 setdefault 方法非常類(lèi)似,我們使用 setdefault 即可。

當(dāng)然啦,關(guān)于分組,還有一種特殊情況,就是詞頻統(tǒng)計(jì)。假設(shè)我們想統(tǒng)計(jì)可迭代對(duì)象中,每個(gè)元素出現(xiàn)的次數(shù)該怎么做呢?

data?=?["apple",?"apple",?"apple",
????????"pear",?"pear",?"pear",
????????"banana",?"banana"]
data_dict?=?{}
for?item?in?data:
????#?此處不能使用?setdefault,因?yàn)樗呛瘮?shù)
????#?.setdefault(item,?0)?+=?1?是不符合語(yǔ)法規(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})
"""

然而說(shuō)到詞頻統(tǒng)計(jì),我們還可以使用 collections 下的 Counter 類(lèi)。

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,除了支持字典操作之外
#?還提供了很多其它操作,其中一個(gè)就是?most_common
#?用于選擇出現(xiàn)頻率最高的幾個(gè)元素
print(data_dict.most_common(2))
"""
[('apple',?3),?('pear',?3)]
"""

還是很簡(jiǎn)單的。

到此這篇關(guān)于一文詳解Python如何優(yōu)雅地對(duì)數(shù)據(jù)進(jìn)行分組的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)分組內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

國(guó)外穩(wěn)定服務(wù)器

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線(xiàn)路精選!

全天候客戶(hù)服務(wù)

7x24全年不間斷在線(xiàn)

專(zhuān)屬顧問(wèn)服務(wù)

1對(duì)1客戶(hù)咨詢(xún)顧問(wèn)

在線(xiàn)
客服

在線(xiàn)客服:7*24小時(shí)在線(xiàn)

客服
熱線(xiàn)

400-630-3752
7*24小時(shí)客服服務(wù)熱線(xiàn)

關(guān)注
微信

關(guān)注官方微信
頂部