[英]defaultdict with default value 1?
我是 python 的新手,我從某個地方閱讀了一些代碼片段。 它是計數排序的實現。
代碼如下:
from collections import defaultdict
def sort_colors(A):
ht = {} # a hash map
ht = defaultdict(lambda:0, ht) # with default value 1
for i in A:
ht[i] += 1
ret = []
for k in [0, 1, 2]:
ret.extend([k]*ht[k])
return ret
與 func 的前兩行一樣,它是
ht = {}
ht = defaultdict(lambda:0, ht)
這個初始化我不是很清楚。你能幫我弄清楚嗎? 而且,我們是否應該用以下內容替換這兩行?
ht = defaultdict(int) # default value 0
簡短回答(根據下面蒙塔羅的回答)
defaultdict(lambda:1)
關於defaultdict
如何工作的長答案
ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
s 與dict
不同之處在於,當您嘗試使用不存在的鍵訪問常規dict
時,它會引發KeyError
。
但是, defaultdict
不會引發錯誤:而是為您創建密鑰。 用哪個值? 隨着callable
的返回,您作為參數傳遞。 在這種情況下,每個新鍵都將創建為值為0
(這是簡單的lambda
函數lambda:0
的返回lambda:0
),這也恰好是int()
的相同返回值,因此在這種情況下,將沒有將默認函數更改為int()
區別。
更詳細地分解這一行: ht = defaultdict(lambda:0, ht)
第一個參數是一個函數,它是一個可調用的對象。 將調用此函數為不存在的鍵創建新值。 第二個參數ht
是可選的,指的是新的defaultdict
將在其上構建的基本字典。 因此,如果ht
有一些鍵和值, defaultdict
也會有這些鍵和相應的值。 如果您嘗試訪問這些鍵,您將獲得舊值。 但是,如果您沒有傳遞基本字典,則會創建一個全新的defaultdict
,因此,所有訪問的新鍵都將獲得從可調用對象返回的默認值。
(在這種情況下,由於ht
最初是一個空的dict
,因此在執行ht = defaultdict(lambda:0)
、 ht = defaultdict(int)
或ht = defaultdict(lambda:0, ht)
根本沒有區別:它們都會構建相同的defaultdict
。
我認為你可以只傳遞一個返回1
的 lambda 函數
d = defaultdict(lambda:1)
相當於@Montaro 的回答:
def a():
return 1
d = defaultdict(a)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.