2015-04-03 162 views
1

我的词典列表在Python转换词典列表的字典

[ 
{'id':'1', 'name': 'a', 'year': '1990'}, 
{'id':'2', 'name': 'b', 'year': '1991'}, 
{'id':'3', 'name': 'c', 'year': '1992'}, 
{'id':'4', 'name': 'd', 'year': '1993'}, 
] 

我希望把这份名单与键为的name值字典的字典。请注意,列表中的不同项目具有不同的值name

{ 
'a': {'id':'1', 'year': '1990'}, 
'b': {'id':'2', 'year': '1990'}, 
'c': {'id':'3', 'year': '1990'}, 
'd': {'id':'4', 'year': '1990'} 
} 

实现此目的的最佳方法是什么?谢谢。

这与Python - create dictionary from list of dictionaries类似,但不同。

+3

你尝试过什么? – 2015-04-03 12:34:49

回答

1
z = [ 
{'id':'1', 'name': 'a', 'year': '1990'}, 
{'id':'2', 'name': 'b', 'year': '1991'}, 
{'id':'3', 'name': 'c', 'year': '1992'}, 
{'id':'4', 'name': 'd', 'year': '1993'}, 
] 
dict_ = {indic['name']:{ 
     k:indic[k] for k in indic if k != 'name'} for indic in z} 
+0

谢谢。是否可以创建它,以便不需要指定其他键,如“id”:x ['id'],'year':x ['year']'? – Tim 2015-04-03 12:37:58

+0

是的,计算出来了,看编辑 – 2015-04-03 12:40:04

3
def to_dict(dicts): 
    if not dicts: 
     return {} 
    out_dict = {} 
    for d in dicts: 
     out_dict[d.pop('name')] = d 
    return out_dict 
+1

你不需要guard子句('if if not dicts:return {}')。如果'dicts'为空,'return out_dict'无论如何都会返回一个空字典。 (另外,感谢提醒我字典有一个'pop'方法。) – 2015-04-03 12:51:28

+2

即使将'None'作为参数值传递,我也想返回字典。 – 2015-04-03 12:53:53

+0

Gotcha。我想,对你来说,味道的事情就是处理一个“无”的输入。 – 2015-04-03 13:17:40

1

尝试这样的:

>>> my_list = [ 
{'id':'1', 'name': 'a', 'year': '1990'}, 
{'id':'2', 'name': 'b', 'year': '1991'}, 
{'id':'3', 'name': 'c', 'year': '1992'}, 
{'id':'4', 'name': 'd', 'year': '1993'}, 
] 
>>> my_dict = {} 
>>> for x in my_list: 
...  my_dict[x['name']] = dict((key, value) for key,value in x.items() if key!='name') 
... 
>>> my_dict 
{'a': {'id': '1', 'year': '1990'}, 'c': {'id': '3', 'year': '1992'}, 'b': {'id': '2', 'year': '1991'}, 'd': {'id': '4', 'year': '1993'}} 
9

您也可以做到这一点使用Dictionary Comprehension

data = [ 
     {'id':'1', 'name': 'a', 'year': '1990'}, 
     {'id':'2', 'name': 'b', 'year': '1991'}, 
     {'id':'3', 'name': 'c', 'year': '1992'}, 
     {'id':'4', 'name': 'd', 'year': '1993'}, 
     ] 

print {each.pop('name'): each for each in data} 

结果: -

{'a': {'year': '1990', 'id': '1'}, 
'c': {'year': '1992', 'id': '3'}, 
'b': {'year': '1991', 'id': '2'}, 
'd': {'year': '1993', 'id': '4'}}