2012-03-07 28 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