2011-04-24 117 views
8

在蟒蛇,我想建立使用字典get方法在默認情況下提供一個空列表數組的字典,然後用信息,例如填充:Python:使用Dictionary get方法默認返回空列表返回None!

dict = {} 
for i in range(0, 10): 
    for j in range(0, 100): 
     dict[i] = dict.get(i, []).append(j) 

然而,當我嘗試上面的代碼我沒有得到任何異常,但我的名單結束了類似如下:

AttributeError: 'NoneType' object has no attribute 'append'

列表有一個附加的方法,所以我簡化我的測試以下:

dict = {} 
for i in range(0, 10): 
    dict[i] = dict.get(i, []).append(i) 

輸出功率爲以下幾點:

{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}

所以我的問題是,默認情況下,爲什麼dict.get(I,[])返回無,而不是[]?做dict.get(我,列表())有同樣的問題,所以我有點難住。

+4

請不要使用'dict'作爲變量名。它與內置的'dict'類相沖突。 – 2011-04-24 17:49:45

+0

我通常不這樣做,我只是想清楚變量是什麼。 – Danielb 2011-04-24 18:03:07

+0

你不想''dict [i] ='在'setdefault'前面。看到我編輯的答案。 – Gabe 2011-04-24 18:14:28

回答

14

這不是dict.get(i, [])這是返回None,這是append。您可能首先需要使用dict.setdefault(i, []).append(j)或僅使用defaultdict

這裏是你會怎麼做:因爲dict已經意味着在Python的東西(你重新定義它),我去掉了多餘dict[i] =這是造成錯誤

d = {} 
for i in range(0, 10): 
    for j in range(0, 100): 
     d.setdefault(i, []).append(j) 

注意,我改變dictd信息。

14

要解決此問題,您需要使用Python的defaultdict

http://docs.python.org/library/collections.html#defaultdict-examples

from collections import defaultdict 

dict = defaultdict(list) 
for i in range(0, 10): 
    for j in range(0, 100): 
     dict[i].append(j) 
+0

這是正確的答案。在Python中沒有獎勵積分「滾動你自己」。 – jwg 2015-05-26 07:37:35

2

append不返回一個列表。它將值附加到列表中並返回None

取而代之的是:

dict[i] = dict.get(i, []).append(j) 

你可以這樣做:

dict.setdefault(i, []) 
dict[i].append(j) 
+1

或者在一行中:'dict.setdefault(i,[ ])。append(j)' - 儘管需要注意的是defaultdict更快。 – 2011-04-24 18:17:27

3

的問題是,append回報None,而不是列表對象。所以

dict[i] = dict.get(i, []).append(j)沒有分配到dict[i]

但是,你可以做簡單得多:

dict.setdefault(i, []).append(j) 

..引用的文檔爲setdefault

If key is in the dictionary, return its value. If not, insert key with a value of default and return default

因此,如果關鍵i是尚未出現它創建它並在其中存儲默認值,在任何情況下它都會返回鍵值 - 哪一個我是對列表的引用,所以你可以直接修改它。

+0

在同一行上執行append和setdefault會導致Python 2.7.1中的異常。 – Danielb 2011-04-24 18:14:24

+0

適用於2.6和3.1的我 – 2011-04-24 18:21:16

0

通過利用列表添加使用get方法的替代方法。

d = {} 
for i in range(0, 10): 
    for j in range(0, 100): 
     d[i] = d.get(i, []) + [j] 
+0

問題是這需要先從'j'中創建一個元素列表以利用它。 – martineau 2015-07-01 18:41:29