将列表转换为字典,其中每个键都嵌套在下一个键下

MrP*_*let 5 python python-3.x

我想转换这个列表:

[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

进入这个字典:

{ 1 :
  { 2 :
    { 3 :
      { 4 : 5 }}}}
Run Code Online (Sandbox Code Playgroud)

这听起来并不太复杂,但是当需要为比表面更深的键分配值时,我感到很困惑。我有一个递归函数来查找我的字典有多深,但我不知道如何告诉我的算法“在此处添加新键”。

DYZ*_*DYZ 7

您正在寻找一个递归函数,该函数构建一个字典,其中第一个列表元素作为键,列表的其余部分作为值进行转换:

l = [1, 2, 3, 4, 5]

def l2d(l):  
    if len(l) < 2: # Not good
        raise Exception("The list is too short")
    if len(l) == 2: # Base case
        return {l[0]: l[1]}
    # Recursive case
    return {l[0]: l2d(l[1:])}

l2d(l)
# {1: {2: {3: {4: 5}}}}
Run Code Online (Sandbox Code Playgroud)

另一个有趣的方法是使用functools.reduce

from functools import reduce
reduce(lambda tail,head: {head: tail}, reversed(l))
# {1: {2: {3: {4: 5}}}}
Run Code Online (Sandbox Code Playgroud)

它逐步将字典构造函数应用于列表的第一个元素和其余元素。列表先倒序,所以构造自然从最后开始。如果列表太短,函数会返回它的第一个元素,这可能是也可能不是。

“减少”解决方案要快得多,大约两个数量级。底线:避免递归