成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你嚴重低估了defaultdict的偷懶能力!

開發 后端
今天來和大家聊聊日常經常使用到的偷懶方法 --> defaultdict

字典作為日常使用頻率較高的一種數據類型,常會遇到判斷key是否在字典中的情況。

這時,我們是否按照如下代碼寫的:

d = dict()
if 'key' in d:
d['key'] += 1
else:
d['key'] = 0
print(d['key']) # 1

我們每次都需要判斷后再進行相關操作。

但是,當我們使用了defaultdict后,就可以偷懶的簡化if else 的格式了:

from collections import defaultdict
d = defaultdict(int)
d["key"] += 1
print(d['key']) # 1

關于defaultdict

大家日常使用到defaultdict的場景,絕大多數都是上述舉例為了減少if else的判斷。

當然除了默認的int初始化,還有列表追加 d = defaultdict(list) 的無腦append操作。

可是,我們是否有深挖過defaultdict的其他場景呢?來先看看它的源碼:

源碼注釋中,只是簡單說明了使用default_factory參數,可以讓調用鍵不存在時生成新值。

def __init__(self, default_factory=None, **kwargs):  
# known case of _collections.defaultdict.__init__
"""
defaultdict(default_factory=None, /, [...]) -->
dict with default factory
The default factory is called without arguments to produce
a new value when a key is not present, in __getitem__ only.
A defaultdict compares equal to a dict with the same items.
All remaining arguments are treated the same as if they were
passed to the dict constructor, including keyword arguments.
# (copied from class doc)
"""
pass

就比如我們上面 defaultdict(int) 將key不存在時,value默認賦值0, d = defaultdict(list)  將key不存在時,value默認賦值空列表。

聽起來功能就是如此了吧...

現在我們來換個場景,拿同學們打力扣周賽舉個例子。

力扣周賽

每個人參加力扣周賽時,會根據我們的比賽結果進行評分。如果是第一次參加比賽,因為沒有初始積分,從0分開始不太合適。

所以每位選手的初始基準分為1500分。這樣就可以根據選手分數來考量本次比賽表現進行加分了。

先來看看默認字典的代碼應該如何操作:

scores = dict()
add_score = 10
# 方法1
if 'xiaoming' in scores:
scores['xiaoming'] += add_score
else:
scores['xiaoming'] = 1500 + add_score
# 方法2
scores['xiaoming'] = scores.get('xiaoming', 1500) + add_score

現在我們想使用defaultdict,但defaultdict如果賦值int,就沒辦法提供這個基準分了,該如何是好?

此時我們應該深入理解下 default_factory ,它不僅僅支持我們傳入默認的int、list,還支持我們使用自定義函數。

from collections import defaultdict
def diy_func():
print("init user score.")
return 1500
scores = defaultdict(diy_func)
scores['xiaoming'] += 10
print(scores['xiaoming'])
# init user score.
# 1510

我們通過自定義一個函數賦值給  default_factory, 幫我們初始化用戶的分數。

但這個自定義的函數方法有些太過單一了,是否可以簡化?此時我們應該考慮到lambda表達式啊!

scores = defaultdict(lambda: 1500)
scores['xiaoming'] += 10
print(scores['xiaoming'])

這樣做是不是就更簡潔方便了。有沒有覺得這操作很nice?

然而,我們注意到defaultdict的 __init__ 方法是存在 **kwargs** 參數,我們還沒有使用呢!

它還可以這么玩:

from collections import defaultdict
data = defaultdict(xiaozhang=1600, xiaowang=1700)
scores = defaultdict(lambda: 1500, data)
scores['xiaoming'] += 10
scores['xiaowang'] -= 15
print(scores.items())
# dict_items([('xiaozhang', 1600), ('xiaowang', 1685), ('xiaoming', 1510)])

所以,defaultdcit可以在 使用 default_factory 的基礎上,導入初始的字典進行。是不更溜了?

關于default_dict的內容,今天就學到這里吧,希望對大家有所幫助。

責任編輯:龐桂玉 來源: 簡說Python
相關推薦

2021-05-21 07:26:15

DataSource接口數據庫

2023-02-14 07:50:30

Python模塊

2020-11-30 22:50:48

AWS服務云計算

2021-04-21 09:19:44

裝飾器Python

2013-01-14 09:36:54

程序員程序員價值

2020-10-04 11:34:28

JavaScript開發技術

2024-10-21 13:11:50

2009-12-21 10:05:00

2022-11-03 11:23:33

阿里云云計算

2025-03-25 09:20:00

NPM庫開發代碼

2017-05-08 11:02:59

TensorFlow神經網絡深度學習

2022-08-01 14:57:24

元宇宙區塊鏈元分析

2024-11-29 10:46:53

2023-06-21 11:19:21

2013-03-19 10:30:28

蘋果三星Galaxy S4

2024-02-19 09:38:58

2020-05-14 18:50:35

Chrome漏洞瀏覽器

2020-10-09 17:38:12

開源開發技術

2018-08-07 16:21:27

計算機知識能力

2021-03-29 12:57:31

漏洞OpenSSLDos
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲高清视频在线 | 国产一区| 91青青草视频 | 一本一道久久a久久精品蜜桃 | 久久精品日产第一区二区三区 | 国产成人jvid在线播放 | 在线观看日本高清二区 | 天天搞天天搞 | 久久久久久久久久影视 | 日韩aⅴ视频 | 九九热这里 | 日本一区二区三区四区 | 国产区一区二区三区 | 亚洲福利视频一区二区 | 精品久久久久久久久久久久久久久久久 | 日一区二区 | 久久久久亚洲视频 | 午夜欧美一区二区三区在线播放 | 伊人网伊人网 | 国产精品国产馆在线真实露脸 | 欧美黑人国产人伦爽爽爽 | 国产aⅴ爽av久久久久久久 | www国产成人免费观看视频,深夜成人网 | 久久久久久久久精 | 久久国产精品无码网站 | 国产日产久久高清欧美一区 | 综合激情av | 日韩成人精品在线 | 亚洲一区二区三区在线播放 | 男人的天堂在线视频 | 国产精品一级在线观看 | 91精品国产91久久综合桃花 | 久久成人一区 | 精品视频一区二区 | 欧美日韩精品一区二区三区蜜桃 | 在线精品亚洲欧美日韩国产 | 欧美一级片久久 | 欧美自拍日韩 | 欧美激情99 | 久久精品网 | 国产日产久久高清欧美一区 |