3

次のような辞書のリストを変換するにはどうすればよいですか。

[{'id':2, 'risk':'a'}, 
 {'id':1, 'risk':'a'}, 
 {'id':32,'risk':'aa'},
 {'id':2, 'risk':'aa'}, 
 {'id':7, 'risk':'a'}, 
 {'id':7, 'risk':'b'}]

ソート後に次のようになるタプルのディクショナリに変換します。

{1:('a', ), 2:('a','aa'), 7:('a','b'), 32:('aa', )}
4

4 に答える 4

4

a を使用しdefaultdictてタプルを自動的に作成し、次を反復処理することができますlist_of_dicts:

list_of_dicts = [{'id':2, 'risk':'a'}, 
 {'id':1, 'risk':'a'}, 
 {'id':32,'risk':'aa'},
 {'id':2, 'risk':'aa'}, 
 {'id':7, 'risk':'a'}, 
 {'id':7, 'risk':'b'}]

from collections import defaultdict

dict_of_tuples = defaultdict(tuple)

for dct in list_of_dicts:
    dict_of_tuples[dct['id']] += (dct['risk'],)

結果は次のとおりです。

>>> dict_of_tuples
defaultdict(<type 'tuple'>, {32: ('aa',), 1: ('a',), 2: ('a', 'aa'), 7: ('a', 'b')})

次に、ソートされた辞書が必要な場合:

>>> from collections import OrderedDict
>>> OrderedDict(sorted(dict_of_tuples.items()))
OrderedDict([(1, ('a',)), (2, ('a', 'aa')), (7, ('a', 'b')), (32, ('aa',))])
于 2013-04-10T05:06:13.513 に答える
0

より長い方法でそれを行います。agfのソリューションほどきれいではありませんが、機能します

new_dict = {}
for x in my_dict_list: 
    m = new_dict.get(x['id'],())
    m += (x['risk'],)
    new_dict[x['id']] = m

入力

my_dict_list = [{'id':2, 'risk':'a'}, 
                {'id':1, 'risk':'a'}, 
                {'id':32,'risk':'aa'},
                {'id':2, 'risk':'aa'}, 
                {'id':7, 'risk':'a'}, 
                {'id':7, 'risk':'b'}]

出力

>>> new_dict
{32: ('aa',), 1: ('a',), 2: ('a', 'aa'), 7: ('a', 'b')}
于 2013-04-10T05:12:54.737 に答える