Python 将字典列表转换为元组字典

Python 将字典列表转换为元组字典,python,list,tuples,python-2.6,dictionary,Python,List,Tuples,Python 2.6,Dictionary,如何转换如下所示的词典列表: [{'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', )} 您可以使用自动创建元组,然后只

如何转换如下所示的词典列表:

[{'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', )}
您可以使用自动创建元组,然后只需迭代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')})

用更长的方式来做。虽然没有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')}
该方法对此类问题的处理时间很短:

>>> lod = [{'id':2, 'risk':'a'}, 
           {'id':1, 'risk':'a'}, 
           {'id':32,'risk':'aa'},
           {'id':2, 'risk':'aa'}, 
           {'id':7, 'risk':'a'}, 
           {'id':7, 'risk':'b'}]
>>> dot = {}
>>> for d in lod:
        idnum, risk = d['id'], d['risk']
        dot.setdefault(idnum, []).append(risk)

>>> dot
{32: ['aa'], 1: ['a'], 2: ['a', 'aa'], 7: ['a', 'b']}

您也可以使用collections.defaultdict来创建相同的效果,但这并不能创建一个常规字典,而且它需要了解工厂函数和零参数构造函数。

通常,在类似的情况下,人们会忘记使用该方法。因此,对于基本python函数:

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'}]

final_dict = {}

for item in list_of_dicts:
    final_dict[item['id']] = final_dict.get(item['id'], tuple()) + (item['risk'],)


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

这给我返回了一个错误:Traceback(最近一次调用last):文件“Dict_to_Tuples.py”,第13行,Dict_of Tuples[dct['id']+=dct['risk']TypeError:只能将tuple(而不是“str”)连接到tupleNote,
OrderedDict
仅在2.7中,OP使用2。6@user1793317你忘了把它变成一个元组
(dict['risk'],)
您需要
dict_元组[dct['id']+=(dct['risk'],)
如答案中所示。请注意
()
关于
dct['risk']
您可以将其更改为创建元组,然后您将不需要第二个
用于
循环。
新的dict[x['id']=(x['risk'])
if
else
中,
new_dict[x['id']+=(x['risk'],)
+1以避免元组的O(n^2)串联。如果确实需要,它们总是可以在最后转换。请记住
('a')修复您的单个元组
实际上不是一个元组,它只是使用括号将字符串
'a'
分组。
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'}]

final_dict = {}

for item in list_of_dicts:
    final_dict[item['id']] = final_dict.get(item['id'], tuple()) + (item['risk'],)


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