2011-10-15 212 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