2017-03-17 93 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

一個這樣做的簡單的方法是遞歸:

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': {}}}}} 

但是,如果你想迭代地做,然後你a重非常接近,只是使用遊標走下結構:

>>> 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': {}}}}} 

但我更喜歡@ozgur的原始答案

+0

我更喜歡你刪除的第一個答案。如果你最終不得不處理迭代器/生成器,但是這不在OP問題的範圍之內,那麼依賴'reversed()'可能會產生問題。 – AChampion

+0

@AChampion儘管「倒轉」似乎很簡單。但是,這是一個很好的觀點,儘管很少見,但可能會有一個生成器或迭代器需要逐步完成 – jamylak