2013-05-06 47 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 

您可以使其更加紧凑,但这并不便于阅读。