2011-10-19 46 views
2

我有一個字符串的嚴格排序列表:如何將嚴格排序的字符串列表轉換爲字典?

['a', 
'b', 
'b/c', 
'b/d', 
'e', 
'f', 
'f/g', 
'f/h', 
'f/h/i', 
'f/h/i/j'] 

此列表類似於樹表示。所以,我需要將其轉換爲字典:

{'a': {}, 
'b': {'c': {}, 
     'd': {}}, 
'e': {}, 
'f': {'g': {}, 
     'h': {'i': {'j': {}}}}} 

正如你所看到的,在這個字典中的鍵是父母和值是兒童。

UPD:我同意空字典優於

回答

8

如果您不None堅持爲葉值,可以使用緊湊的代碼

my_dict = lambda: defaultdict(my_dict) 
d = my_dict() 
for x in my_list: 
    reduce(defaultdict.__getitem__, x.split("/"), d) 

無可否認,它不是」 t 明顯這個代碼幹什麼,但是很簡潔:)

+0

非常令人印象深刻!我喜歡這個代碼。 – scraplesh

+0

@ klesh:謝謝! –

0

這裏是我的裂紋它。我反轉了優化的路徑,因爲pop()比pop(0)快得多。

def add_branch(root, path): 
    branch = path.pop() 
    if path: 
     if branch not in root or root[branch] is None: 
      root[branch] = {} 
     add_branch(root[branch], path) 
    else: 
     root[branch] = None 

def totree(strings): 
    root = {} 
    for string in strings: 
     path = string.split("/") 
     path.reverse() 
     add_branch(root, path) 
    return root 

使用這樣的:

my_tree = totree(['a', 'b', 'b/c', 'b/d', 'e', 'f', 'f/g', 'f/h', 
    'f/h/i', 'f/h/i/j']) 
5
di = {} 
for a in arr: 
    al = a.split("/") 
    d = di 
    for elem in al: 
     if elem in d: 
      d = d[elem] 
     else: 
      d[elem]={} 

print di 

注意elemts不存儲按字母順序排列的字典!

+0

這不會產生請求的結果,因爲它使用'{}'而不是'None'作爲葉值。 –

+1

@lazyr:正確,但我認爲OP能夠適應他的需求:)它會混亂代碼,檢查它是None還是它是一個字典等,但我認爲其基本思想比這樣的實現細節。 – phimuemue

+0

此代碼對'[「a」,「b/c」]'失敗。不過,從規格說明中不太清楚是否需要涵蓋這種情況。 –

0

希望它能幫助,遞歸方法:)

import pprint 

l = ['a', 
'b', 
'b/c', 
'b/d', 
'e', 
'f', 
'f/g', 
'f/h', 
'f/h/i', 
'f/h/i/j'] 

def put(d, elems): 
    f = elems[0] 
    if len(elems)==1: 
     d[f]=None 
    else: 
     if f not in d or d[f]==None: 
      d[f] = {} 
     put(d[f], elems[1:]) 

d = {} 
for x in l: 
    put(d, x.split('/')) 

pprint.pprint(d) 
0

這是我的分辨率:

from collections import defaultdict 
from pprint import pprint 

input = ['a', 'b', 'b/c', 'b/d', 'e', 'f', 'f/g', 'f/h', 'f/h/i', 'f/h/i/j'] 
result = defaultdict(dict) 
for i in input: 
    path = i.split('/') 
    key = path[0] 
    value = {} 
    buffer = {key:value} 
    for folder in path[1:]: 
     value[folder] = {} 
     value = value[folder] 
    result[key].update(buffer[key]) 
pprint(dict(result)) 
相關問題