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

相关问题