2012-03-07 33 views
-3

我的列表:如何使字典從列表

list = ['name1', 'option1.1 value1.1', 'option1.2 value1.2', 'name2', 'option2.1 value2.1', 'option2.2 value2.2', 'option2.3 value2.3'] 

,我想創建這樣解釋:

dict = {'name1':{'option1.1':'value1.1', 'option1.2':'value1.2'}, 'name2':{'option2.1': 'value2.1', 'option2.2':'value2.2', 'option2.3':'value2.3'} 

我不知道有多大是我的名單(姓名的號碼,選擇和值)。任何想法?

+0

什麼是您已知的每組數據?每個名稱可以有不定數量的選項,但名稱永遠不會被格式化爲'option.name'或'value.name',並且選項和值的前面總是有'option.'和'value.',更正? – 2012-03-07 18:53:42

+3

你有試過任何東西嗎?因爲你沒有特定的長度到每個集合,你將不得不循環每個項目,並對包含'name'的值進行操作以啓動一個新的密鑰,這是一個新的字典 – jdi 2012-03-07 18:55:31

+1

你怎麼知道列表中的哪些項目是「名稱「,哪些是」選項「?數據來自哪裏? – 2012-03-07 18:58:40

回答

1

假設的名字將永遠是一個令牌(也,不使用列表和字典作爲變量名,因爲它們是建宏):

result = {} 
for val in my_list: 
    split_val = val.split() 
    if len(split_val) == 1: 
     last_name = split_val[0] 
     result[last_name] = {} 
    else: 
     result[last_name][split_val[0]] = split_val[1] 

注意,這將窒息如果列表格式錯誤並且第一個值不是名稱。

+0

你可以通過爲'last_name'提供一個合理的默認值(在循環前面加上'last_name ='noname'')來避免後者。另一方面,「錯誤永遠不應該默默通過」,你知道 – georg 2012-03-07 19:26:23

+0

@ thg435我最初有一個默認值,但我認爲真的不應該工作。儘管如此,一些更好的錯誤處理方法將會很好。 – 2012-03-07 19:34:55

2

與列表和字典理解:

id=[b[0] for b in enumerate(lst) if 'name' in b[1]]+[None] 
d={lst[id[i]]:dict(map(str.split,lst[id[i]+1:id[i+1]])) for i in range(len(id)-1)} 

原來的名單這裏命名lst

這也許並不如@sr22222答案爲可讀,但也許它的速度更快,而且口味的問題。

+0

我不認爲這會起作用。如果名稱不包含名稱,或者每個名稱有多個選項/值對,是不是會窒息? – 2012-03-07 19:57:22

+0

它的工作原理,只是嘗試。 – 2012-03-07 19:59:03

+0

我只是用一個微不足道的例子試過了,它失敗了。 'lst = ['foon','fooopt.1 fooval.1','fooopt.2 fooval.2','barn','baropt.1 barval.1']'給了{}給b。我認爲至少,如果len(b [1])。split()== 1'中的'if'name'在b [1]'中需要。 編輯:即使這樣,它會錯過「穀倉」。 – 2012-03-07 20:06:22