2017-03-17 3 views
3

長さが違う可能性のある文字列があり、入れ子になった辞書を作成したいと思います。私はこれまでこれを持っていて、可変深度の問題を乗り越える方法を理解しているようです。リストから入れ子になったpythonディクショナリを構築する

string = "a/b/c/b" 
    x = string.split('/') 
    y = {} 
    for item in x: 
     y[item] = dict() 
     ............. 

私は多くの方法を試しましたが、動的に構築する方法は分かりません。最終的な結果は次のとおりです。

{'a' :{'b' : {'c': {'d': {}}}} 

この問題を解決するためのデザインやアイディアについてのご意見をお待ちしております。

おかげで、

答えて

2

次のようにするだけのループを更新:

y = {} 
for item in reversed(x): 
    y = {item: y} 
0

はこれを試してみてください:

string = "a/b/c/b" 
x = string.split('/') 
x.reverse() 
y = {} 
count=0 
for item in x: 
    if count==0: 
     tmp={item:{}} 
    else: 
     tmp={item: tmp} 
    count+=1 
print tmp 

出力:これを行うの

{'a': {'b': {'c': {'b': {}}}}} 
0

1つの簡単な方法は、再帰です:

def fn(s): 
    if not s: 
     return {} 
    x, *y = s # Python3, for Python2 x, y = s[0], s[1:] 
    return {x:fn(y)} 

>>> fn("a/b/c/b".split('/')) 
{'a': {'b': {'c': {'b': {}}}}} 

しかし、あなたがしたい場合はそれを反復して実行します非常に近い再、単に構造を歩くために、カーソルを使用します。

>>> y = {} 
>>> c = y 
>>> for item in "a/b/c/b".split('/'): 
...  c[item] = {} 
...  c = c[item] 
>>> y 
{'a': {'b': {'c': {'b': {}}}}} 
0
>>> text = 'a/b/c/d' 
>>> d = node = {} 
>>> for c in text.split('/'): 
... node = node.setdefault(c, {}) 
... 
>>> d 
{'a': {'b': {'c': {'d': {}}}}} 
+1

このコードは質問に答えるかもしれませんが、どのようにして問題が解決されたのか、なぜそれが解決するのかについての追加の文脈を提供することで、回答の長期的価値が向上します。 –

1

一つのライン@ozgur's answer

>>> string = "a/b/c/d" 
>>> reduce(lambda x, y: {y: x}, reversed(string.split('/')), {}) 
{'a': {'b': {'c': {'d': {}}}}} 
のバージョンを削減

しかし、私は@ oggurの元の回答を好む

+0

あなたが最初に削除した回答が好まれました。イテレータ/ジェネレータに対処しなければならない場合は、OPの質問の範囲外ですが、 'reversed()'に依存することは問題になります。 – AChampion

+0

@AChampion「逆転した」ものはとても単純です。しかし、これは良い点ですが、稀ですが、ステップ実行したいジェネレータまたはイテレータが存在する可能性があります – jamylak

関連する問題