簡體   English   中英

defaultdict 的默認值是 1?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM