2013-10-31 91 views
1

一本詞典我有這樣的字典定義:酸洗使用defaultdict

def train(features): 
    model = collections.defaultdict(lambda: 1) 
    for f in features: 
     model[f] += 1 
    return model 

沿途後來,我想用鹹菜和轉儲字典到一個文本文件:

f = open('dict.txt', 'wb') 
pickle.dump(Nwords, f) 

然而,代碼不起作用,我收到一個錯誤。顯然pickle無法使用lambda,我最好使用模塊級函數定義model。我已經閱讀了答案here

不幸的是,因爲我沒有使用Python的經驗,我不確定如何做到這一點。我想:

def dd(): 
    return defaultdict(int) 

def train(features): 
## model = defaultdict(lambda: 1) 
    model = defaultdict(dd) 
    for f in features: 
     model[f] += 1 
    return model 

我收到的錯誤:

TypeError: unsupported operand type(s) for +=: 'collections.defaultdict' and 'int' 

除此之外,return defaultdict(int)總是分配一個零到關鍵的第一次出現,而我希望它分配1。任何想法我如何解決這個問題?

回答

2

不幸的是,那個答案對於這個問題是正確的,但對你的問題卻很微妙。儘管一個頂級函數而不是lambda很好,確實會讓pickle更快樂,但函數應該返回默認值來使用,這對於您的情況是而不是另一個defaultdict對象。

簡單地返回相同的值您lambda回報:

def dd(): 
    return 1 

每次嘗試訪問尚不存在defaultdict實例的關鍵時刻,dd被調用。另一個帖子然後返回另一個defaultdict實例,那個設置爲使用int作爲默認值,它與另一個問題中顯示的lambda匹配。