的字典如何转换字典的名单看起来是这样的:转换词典列表到元组
[{'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',)}
可以使用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',))])
即返回一个错误对我来说:回溯(最近最后一次通话): 文件 “Dict_to_Tuples.py”,13号线,在
请注意,OrderedDict只在2.7,OP在使用2.6 – 2013-04-10 05:14:07
@ user1793317你忘记把它变成一个元组('dict ['risk'], )' – 2013-04-10 05:14:45
更长的方式这样做。还不如利落的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')}
''你可以改变它来创建元组,然后你不需要第二个'for'循环。 'new_dict [x ['id']] =(x ['risk'],)'in'if',in'else','new_dict [x ['id']] + =(x [风险'],)' – 2013-04-10 05:21:18
感谢提示 – RedBaron 2013-04-10 05:23:16
的dict.setdefault方法使这类问题的短期工作:
>>> 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创建相同的效果,但不会创建常规字典,它需要了解工厂函数和零参数构造函数。
+1以避免元组的连接(n^2)。如果真的需要它们,它们总是可以被转换 – jamylak 2013-04-10 05:42:01
通常人们会忘记在类似的情况下使用dict.get
方法。因此,与基本的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',)}
固定的单一元组,记住'(“A”)'实际上不是一个元组,这只是使用圆括号组字符串''a''。 – jamylak 2013-04-10 07:38:23