2016-05-02 78 views
0

我正在嘗試編寫一些涉及創建字典默認字典的代碼。但是,我不知道如何初始化/創建這樣的事情。我現在的嘗試看起來是這樣的:如何創建字典的默認字典

from collections import defaultdict 
inner_dict = {} 
dict_of_dicts = defaultdict(inner_dict(int)) 

使用詞典的這個默認快譯通的是爲每個字對,我從一個文件我打開生產(例如[「M UH M」,「M oo m']])來設置由空格分隔的第一個單詞的每個片段作爲外部字典中的關鍵字,然後對由空白空間分隔的第二個單詞中的每個片段計數該片段的頻率。

例如

[['M UH M', 'm oo m']] 
(<class 'dict'>, {'M': {'m': 2}, 'UH': {'oo': 1}}) 

剛剛運行這個現在它似乎並不具有輸出任何錯誤,但我只是想知道,如果像這樣將實際產生的字典的默認字典。

道歉,如果這是重複的,但先前的這些問題的答案一直混淆,並在不同的情況下。

+0

那麼,你粘貼的當前代碼是無效的......'inner_dict'被定義爲一個字典,然後你試圖把它稱爲'inner_dict(int)'... – donkopotamus

回答

0

初始化一個defaultdict創建字典作爲它的默認值,你可以使用:

d = defaultdict(dict) 

對於這個特定的問題,一個collections.Counter會更適合

>>> from collections import defaultdict, Counter 
>>> d = defaultdict(Counter) 
>>> for a, b in zip(*[x.split() for x in ['M UH M', 'm oo m']]): 
... d[a][b] += 1 
>>> print(d) 
defaultdict(collections.Counter, 
      {'M': Counter({'m': 2}), 'UH': Counter({'oo': 1})}) 

編輯

您對沒有012的等效評論表示了興趣。下面是使用相當於普通dict

>>> from collections import defaultdict 
>>> d = defaultdict(dict) 
>>> for a, b in zip(*[x.split() for x in ['M UH M', 'm oo m']]): 
... d[a][b] = d[a].get(b, 0) + 1 
>>> print(d) 
defaultdict(dict, {'M': {'m': 2}, 'UH': {'oo': 1}}) 
+0

這是一種優雅的方式!有沒有辦法做到這一點,沒有計數器,而只是默認字典和字典? –

+0

@IndifferentPotato我用'defaultdict(dict)'添加了相當於' – donkopotamus

+0

的等價物,只有普通的** dict **輸出一個AttributeError:'list'對象沒有屬性'split''。 :/ –

0

你也可以使用一個普通的字典及其setdefault方法。

my_dict.setdefault(key, default)將查找my_dict[key]和...

  • ...如果鍵已經存在,返回其當前值,而不修改它,或者...
  • ...指定默認值(my_dict[key] = default)然後返回。

所以,你可以隨時撥打my_dict.setdefault(key, {}),當你想從你的外在字典而不是正常的my_dict[key]的值來檢索或者利用該密鑰分配的實際價值,如果它#的現在,或得到一個新的空字典作爲默認值,並自動存儲到外部字典中。

例子:

outer_dict = {"M": {"m": 2}} 

inner_dict = d.setdefault("UH", {}) 
# outer_dict = {"M": {"m": 2}, "UH": {}} 
# inner_dict = {} 
inner_dict["oo"] = 1 
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1}} 
# inner_dict = {"oo": 1} 

inner_dict = d.setdefault("UH", {}) 
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1}} 
# inner_dict = {"oo": 1} 
inner_dict["xy"] = 3 
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1, "xy": 3}} 
# inner_dict = {"oo": 1, "xy": 3} 

這樣,你總能得到有效的inner_dict,一個空默認一個或那是已經存在給定鍵的一個。由於字典是可變數據類型,修改返回的inner_dict也將修改outer_dict內的字典。