網站首頁 編程語言 正文
假設我們有這樣一種數據:
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])]
"""
如果是你的話,你會怎么做呢?很容易想到的一種解決方案是構造一個字典:
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])]
"""
這種方案完全沒有問題,不過我們還可以寫的更優雅一些,也就是使用字典的 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)?含義如下
????#?當?k?不存在時,將?k:?v?設置在字典中,并返回?v
????#?當?k?存在時,直接返回?k?對應值
????data_dict.setdefault(name,?[]).append(count)
print(list(data_dict.items()))
"""
[('apple',?[30,?35,?32]),?
?('pear',?[60,?32,?60]),?
?('banana',?[102,?104])]
"""
setdefault 是一個非常方便的方法,但是使用頻率卻不怎么高,或者說該方法不太讓人喜歡。主要是每次調用都要給一個初始值,比如代碼中的空列表 []。另外這里的初始值可以任意,如果你希望添加的時候還能實現去重效果,那么就將空列表換成空集合即可。
或者我們還可以使用 defaultdict,它位于 collections 模塊中。
from?collections?import?defaultdict
data?=?[
????("apple",?30),?("apple",?35),
????("apple",?32),?("pear",?60),
????("pear",?32),?("pear",?60),
????("banana",?102),?("banana",?104)
]
#?里面接收一個?callable
#?當訪問的?k?不存在時,返回?callable?調用之后的值
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 即可。
當然啦,關于分組,還有一種特殊情況,就是詞頻統計。假設我們想統計可迭代對象中,每個元素出現的次數該怎么做呢?
data?=?["apple",?"apple",?"apple",
????????"pear",?"pear",?"pear",
????????"banana",?"banana"]
data_dict?=?{}
for?item?in?data:
????#?此處不能使用?setdefault,因為它是函數
????#?.setdefault(item,?0)?+=?1?是不符合語法規則的
????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})
"""
然而說到詞頻統計,我們還可以使用 collections 下的 Counter 類。
from?collections?import?Counter
data?=?["apple",?"apple",?"apple",
????????"pear",?"pear",?"pear",
????????"banana",?"banana"]
data_dict?=?Counter(data)
#?直接搞定,Counter?已經包含了我們之前的邏輯
print(data_dict)
"""
Counter({'apple':?3,?'pear':?3,?'banana':?2})
"""
#?Counter?繼承?dict,除了支持字典操作之外
#?還提供了很多其它操作,其中一個就是?most_common
#?用于選擇出現頻率最高的幾個元素
print(data_dict.most_common(2))
"""
[('apple',?3),?('pear',?3)]
"""
還是很簡單的。
原文鏈接:https://segmentfault.com/a/1190000042098698
相關推薦
- 2022-11-27 C語言結構體字節對齊的實現深入分析_C 語言
- 2024-03-02 Quasar框架使用環境變量聲明接口地址,無需手動判斷
- 2022-04-27 詳解linux里的backlog參數_Linux
- 2022-05-15 jquery事件綁定方法介紹_jquery
- 2022-08-16 python+pytest自動化測試函數測試類測試方法的封裝_python
- 2023-01-17 Keras中Sequential模型和Functional模型的區別及說明_python
- 2023-02-23 Redis的setNX分布式鎖超時時間失效?-1問題及解決_Redis
- 2023-04-08 Swift?HTTP加載請求Loading?Requests教程_Swift
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支