2011-10-19 5 views
2

私は、文字列の厳密にソートされたリストを持っている:厳密にソートされた文字列のリストをdictに変換する方法は?

['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) 

確かに、それはにISN t その明らかにこのコードは何ですか、それは簡潔です:)

+0

非常に印象的!私はこのコードが大好きです。 – scraplesh

+0

@klesh:ありがとう! –

0

よりも優れていることに同意し、ここでそれで私の亀裂です。 pop()はpop()よりもはるかに高速ですので、私は最適化のためのパスを逆にします。

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かdictかどうかをチェックしてコードを混乱させましたが、根本的なアイデアはそのような実装の詳細。 – 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)) 
関連する問題