2011-10-15 120 views
4

的名单我有以下格式的词典,我不知道线或者我要去的项目数接受:平转换Python字典来字典

{'line(0).item1':'a', 'line(0).item2':'34', 
'line(1).item1':'sd', 'line(1).item2':'2', 'line(1).item3':'fg', 
'line(2).item1':'f' ... } 

什么是最Python的以下列格式将其解析为字典列表:

[{'item1':'a', 'item2':'34'}, 
{'item1':'sd', 'item2':'2', 'item3':'fg'}, 
{'item1':'f',...}, ...] 

在此先感谢。

回答

5
d = {'line(0).item1':'a' ...} 

out = collections.defaultdict(list) 
for k,v in d.items(): 
    n,val = re.findall(r'^line\((\d+)\)\.(\w+)$', k)[0] 
    out[int(n)].append((val,v)) 

my_list = [dict(out[v]) for v in sorted(out)] 

和输出将是预期的:

[{'item2': '34', 'item1': 'a'}, {'item2': '2', 'item3': 'fg', 'item1': 'sd'}, {'item1': 'f'}] 
0

我会去使用词典的中间字典,因为没有办法知道你有多少“行”必须在方式结束,并且不能在稍后的列表末尾插入新元素。

它应该很简单,可以遍历此dict中的每个元素并将其解析为行号和关键字。然后,您可以轻松地将新的dict转移到您所需的列表中。一种可能的实现可以是:

intermediate_dict = {} 
for entry in my_dict: 
    line_string, key = entry 
    line_number = int(line_string[line_string.index('(') + 1: line_string.index(')')]) 
    if line_number not in intermediate_dict: 
     intermediate_dict[line_number] = {} 
    intermediate_dict[line_number][key] = my_dict[entry] 

new_list = [] 
for i in xrange(len(intermediate_dict)): 
    new_list.append(intermediate_dict[i]) 
+0

这只会工作到'线(9)'...此外,你应该使用'dict.setdefault'或'collections.defaultdict'更换'if' – JBernardo

+0

@JBernardo为什么直到'line(9)'才工作?我在这里看不到任何一个数字的假设...... – immortal

+0

对不起,我看到了'+ 1'但忘记了切片。 – JBernardo