0

このような辞書のリストがあるとします

dlist = [d1, d2, d3, d4] 今 d1 inturn は次のような辞書の辞書です

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

内部にはさらに多くの辞書があります

これらすべての辞書をデフォルトに変換できる単一行関数はありますか。

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)
4

2 に答える 2

2

子辞書のいずれにもキーが存在しない場合、キーエラーが発生しないようにしたい。

デフォルトの設定は、このための 1 つのオプションです。または、単に次を使用しますget

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

getNoneを発生させる代わりに、キーが存在しない場合に戻りKeyErrorます。次のように渡すことで、None 以外のデフォルト値を返すようにすることができます。

>>> d.get('foo',{})
{}
于 2013-05-06T08:21:11.597 に答える
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

これをもっとコンパクトにすることはできますが、読みやすくはなりません。

于 2013-05-06T08:31:16.487 に答える