2015-04-03 163 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'}}