成人免费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

2025-03-25 09:20:00

NPM庫開發代碼

2022-11-03 11:23:33

阿里云云計算

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

2020-05-14 18:50:35

Chrome漏洞瀏覽器

2024-02-19 09:38:58

2018-08-07 16:21:27

計算機知識能力

2020-10-09 17:38:12

開源開發技術

2021-03-29 12:57:31

漏洞OpenSSLDos
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九热在线视频 | 91精品国产91综合久久蜜臀 | 久久er99热精品一区二区 | 亚洲精品福利视频 | 色婷婷久久综合 | 亚洲性爰| 在线成人免费视频 | 黄视频国产 | 国产精品伦理一区二区三区 | 一级黄色影片在线观看 | 亚洲欧美一区二区三区国产精品 | 欧美最猛黑人 | 成人免费大片黄在线播放 | 武道仙尊动漫在线观看 | 国产精品久久久久久亚洲调教 | 网站黄色av | 久久免费精品 | 视频一区中文字幕 | 久久久久久国产精品免费免费 | 欧美成人免费在线 | 91久久精品国产91久久性色tv | 亚洲 成人 av | 九九色综合 | 日韩成年人视频在线 | 国产区高清 | 日韩av高清 | 欧美日韩国产一区二区三区 | 日韩一区二区三区在线视频 | 91在线精品秘密一区二区 | 综合久久久久久久 | 日本一区二区三区视频在线 | 亚洲欧洲av在线 | 日韩电影免费在线观看中文字幕 | 日日摸天天添天天添破 | 久久久综合精品 | 欧美综合一区二区 | 日韩精品一区二区三区在线播放 | 国产精品资源在线观看 | 国产精品久久久久久久久久免费看 | 国产成在线观看免费视频 | 97人人澡人人爽91综合色 |