2013-05-06 20 views
0

假設我有字典這樣怎樣才能讓裏面的詞典默認的列表中的所有詞典在Python

dlist = [d1, d2, d3, d4] 列表現在D1 inturn是詞典的詞典一樣

d1 = {'dd1':{'a':2. 'ddd1':'moredict'}}

和內可以有更多的字典

是否有單行函數可以將所有這些字典轉換爲deafult。

我想,如果某些key不存在任何子字典,那麼它不會得到關鍵錯誤。

編輯:

#something like this , but i was looking for something buildin 
def convert_dict(dictionary): 
    for key, value in dictionary.iteritems(): 
     if isinstance(value, dict): 
      dictionary[key] = defaultdict(list, value) 
      convert_dict(value) 
+0

您是否嘗試過通過所有的值寫一個遞歸函數迭代,並將其轉換爲,如果它是一本字典一個defaultdict? – huon 2013-05-06 07:55:37

+0

,我可以做,但看起來越野車,我想可能會有一些的buildin,解決我的問題 – user2330497 2013-05-06 07:59:07

+0

爲什麼它看起來越野車? – Mark 2013-05-06 08:00:09

回答

2

我想,如果一些關鍵並不在任何兒童字典的存在,那麼它不 得到關鍵的錯誤。

設定的默認值是爲這一個選項,或者乾脆使用get

>>> d = {'key': 1} 
>>> d['foo'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'foo' 
>>> d.get('foo') 

get將返回None如果鍵不存在,而不是提高KeyError。你可以把它返回None以外的默認值,通過傳遞它:

>>> d.get('foo',{}) 
{} 
+0

我更喜歡這個時間我沒有得到任何其他的解決方案 – user2330497 2013-05-06 08:44:17

+0

'dict.setdefault'也可以派上用場,如果你得到一個可變的值並打算改變它:'d.setdefault(「foo」 ,[])。append(「bar」)' – Blckknght 2013-05-06 09:10:35

0

由於dbaupp已經指出,豈不是更好地寫出了遞歸函數呢?因爲你的字典可以嵌套,所以我不認爲有一個'漂亮'的方式來處理這個問題。

def dict_to_ddict(d, defaultfunction): 
    '''Convert (nested) dict to defaultdict''' 
    ddict = defaultdict(defaultfunction) 
    for k, v in d.iteritems(): 
     if isinstance(v, dict): 
      ddict[k] = dict_to_ddict(v, defaultfunction) 
     else: 
      ddict[k] = v 
    return ddict 

您可以使其更加緊湊,但這並不便於閱讀。