2011-03-09 186 views
1

如何在python中创建其值也是字典的字典?基本上,我的问题是,我有列出的这份名单:Python中的字典词典!

['http://a11y.in/a11ypi/idea/a11y_firesafety.html', 
['lang:hi', 'lang:kn'], 
['a11y_firesafety.html:div1', 'a11y_firesafety.html:div1'], 
['hi', 'kn'] 
] 

,我想将其转换为:

{'http://a11y.in/a11ypi/idea/a11y_firesafety.html': 
    {'lang:hi': 
    {'lang:kn': 
     {'a11y_firesafety.html:div1': 
      {'a11y_firesafety.html:div1': {'hi', 'kn'}}}}}} 

可有人建议我一个办法做到这一点?我尝试使用多维字典,但他们没用。请帮忙!

+0

这不是从一个例子中如何准确清晰建立这本词典。再加上例子'{'hi','kn'}'中的最后一个“字典”在语法上没有意义。这应该是一个列表? – 2011-03-09 18:23:13

+3

'{'hi','kn'}'不是一个字典,最多只能在更新的Python版本中设置(具有设置字面值的版本)。此外,问题描述不仅仅是模糊的,而且您实际上提供了*没有*关于您尝试以及失败的信息。 – delnan 2011-03-09 18:23:59

+0

@ user567797:我同意其他人在这里 - 你的问题可能会更清楚一点,我猜'''嗨','kn'}应该是'{'hi':'kn''} 。请考虑编辑问题更清楚。 – phooji 2011-03-09 18:42:31

回答

1

试试这个:

def forget_torpedoes(mylist): 
    return reduce(lambda acc, x: {x : acc}, reversed(mylist)) 

这将为一个平面列表的工作方式如下:

In [9]: forget_torpedoes([5, 6, 7, 8]) 
Out[9]: {5: {6: {7: 8}}} 

我认识到,没有你的问题的回答(全部),因为你已经嵌套的列表。但是,再次,它应该让你大部分的方式:)

2

构建phooji的答案,你可以使用类似itertools.chain的功能来照顾嵌套列表。

def forget_torpedoes(mylist): 
    return reduce(lambda acc, x: {x : acc}, reversed(mylist)) 

def chain(iterable): 
    for it in iterable: 
     if isinstance(it, str): 
      yield it 
     else: 
      for element in it: 
       yield element 

print forget_torpedoes(tuple(chain(nested_list))) 
1

像这样:

>>> l=['http://a11y.in/a11ypi/idea/a11y_firesafety.html', 
... ['lang:hi', 'lang:kn'], 
... ['a11y_firesafety.html:div1', 'a11y_firesafety.html:div1'], 
... ['hi', 'kn'] 
... ] 
>>> d={} 
>>> d[l[0]]=reduce(lambda val, key : {key : val}, reversed(sum(l[1:],[]))) 
>>> d 
{'http://a11y.in/a11ypi/idea/a11y_firesafety.html': 
    {'lang:hi': 
    {'lang:kn': 
     {'a11y_firesafety.html:div1': 
      {'a11y_firesafety.html:div1': 
       {'hi': 'kn'}}}}}} 

我要把它留给你的,公平的读者,解释给你的老师......