2015-05-20 75 views
15

我是python的新手,我從某處閱讀了一些代碼片段。這是一個計數排序的實現。defaultdict與默認值1?

的代碼如下:

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) 

我不是這個initialization.Could你好心幫我身材很清楚出來?還有,我們是不是應該用下面的這兩句代替?當您試圖訪問一個普通dict與不存在的關鍵

ht = defaultdict(int) # default value 0 
+3

爲你從收藏導入,可能也只是使用'Counter'。 – Kevin

+2

默認值爲沒有1,它的0 –

+2

嘗試'HT = defaultdict(拉姆達:1)#默認值1'並刪除前面的'ht = {}'在下一行中改變'ht'的值後就不會做任何事情。 – martineau

回答

16
ht = {} 
ht = defaultdict(lambda:0, ht) 

defaultdict s是在dict不同,它提出了一個KeyError
defaultdict但是不會引發錯誤:它會爲您創建密鑰。用哪個值?隨着callabe的回報,你作爲一個參數通過。在這種情況下,每個新密鑰將創建值爲0(這是簡單的lambda函數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

+0

(lambda:0,ht)只能被0調用? – chancyWu

+0

這是正確的。我編輯了這篇文章,以更詳細地分解它 – RafaelC

+0

有趣的是,這是!我在哪裏可以學到更多這樣的概念? –

25

我想你可以只通過一個lambda。功能只要返回1

d = defaultdict(lambda:1) 
+3

這是正確的。不是被接受的答案。 – jimh