2014-03-24 42 views
0

我有一個函數:嘗試追加項目爲默認字典

#Should be named tryAppendingToListInADict but I'm too lazy for that long of a name 
def tryAppendingToDict(dictionary, key, item): 
    try: 
     #append to an existing list 
     dictionary[key].append(item) 
    except KeyError: 
     #list doesn't exist yet, so make one 
     dictionary[key] = [item] 

在我使用此功能在一個字典大多數情況下,我們稱之爲defaultDictOfLists,在我的代碼看起來像

tryAppendingToDict(defaultDictOfLists, 'spam', 'eggs') 
tryAppendingToDict(defaultDictOfLists, 'spam', 'beacon') 
tryAppendingToDict(defaultDictOfLists, 'not spam', 'yuck!') 
#... 
tryAppendingToDict(differentDict, 'spam', 'I don't like spam!') 

所以我想嘗試爲我的函數做一個關鍵字參數,它會假設你將項目追加到defaultDictOfLists。然而,這裏的主要問題是,這一功能由單獨的模塊進口(而且應該繼續存在),因此一個簡單

def tryAppendingToDict(key, item, dictionary = defaultDictOfLists): 

提出了一個NameErrorglobals()['defaultDictOfLists']提出了一個KeyError

有沒有辦法解決它?它會澄清我的代碼並加速編碼過程。


編輯,因爲這個字典傳遞給Django模板和那些不處理defaultdicts很好由於某種原因,我沒有使用defaultdict(list)

。所以我不得不將這個defaultdict轉換回正規字典,如果我記得正確的話,這需要O(n)個時間。

+2

您一直使用術語「defaultDict」,但好像您試圖實現看起來就像['defaultdict'](http://docs.python.org/2/library/collections的.html#collections.defaultdict)。如果您使用2.5或更高版本,則可以使用該版本。 –

+0

我會爲defaultDictOfLists – njzk2

回答

0

你爲什麼不只是monkeypatch呢?您可以:

from module import tryAppendingToDict as _tryAppendingToDict 

def tryAppendingToDict(key, item, dictionary=defaultDictOfLists): 
    return _tryAppendingToDict(dictionary, key, item) 

並在實際定義defaultDictOfLists的模塊中使用此函數。

此外,我看不到此代碼的用處,確定您可以使用defaultdict,但您也可以使用字典的setdefault方法。它會降低你的字典插入到一個直線,轉彎tryAppendingToDict()沒用:

>>>d={} 
>>>d.setdefault('key',['value']) 
>>>d 
{'key': ['value']} 
+0

的值添加setter函數是的,猴子修補是一個好主意。 'setdefault'不是真的,因爲我必須嘗試添加項目,而不是添加它們。 – Dunno

+0

@Dunno你可以用'setdefault'做這個:'d.setdefault('key',['value'])。append('value2')'你會得到'{'key':['value' , '值2']}'。它非常強大。 'setdefault'在被調用時返回'default'的值,所以你可以在其上應用方法。 –

+0

是的,但我不能在for循環中做,因爲'd.setdefault(key,[value])。append(value)'將會追加'value'兩次。無論如何,我不得不使用'if'或'try'。 – Dunno

0

如果你想在那些字典的值列表組項目,則可以使用collections.defaultdict

import collections 

data = collections.defaultdict(list) 
raw = [(i % 3, i) for i in range(10)] # sample data 

for key, value in raw: 
    data[key].append(value) 

沒有太多麻煩你得到你想要的:

In [10]: data 
Out[10]: defaultdict(<type 'list'>, {0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}) 

查看http://docs.python.org/2/library/collections.html#collections.defaultdict瞭解更多信息和用例。

+0

看到我編輯的問題,對不起,先不澄清 – Dunno