python-3.x 给定列表,如何生成嵌套字典

hjzp0vay  于 2023-01-10  发布在  Python
关注(0)|答案(2)|浏览(162)

给定下面的列表,使用Python 3如何生成一个嵌套字典,其中list[0]包含list[1:]作为嵌套子项。

list = [
    ["Layer 1.A", "Layer 1.B"],
    ["layer 2.A", "Layer 2.B"],
    ["Layer 3"],
    ["Layer 4"]
    
]

我已经尝试了许多方法,但没有一个能给我正确的输出。我已经尝试了以下方法:
1.尝试使用python的产品(生成所有排列,但未给予正确的输出。它看起来像:

[
    ["Layer 1.A", "Layer 2.A", "Layer 3", "Layer 4"],
    ["Layer 1.A", "Layer 2.B", "Layer 3", "Layer 4"],
    ["Layer 1.B", "Layer 2.A", "Layer 3", "Layer 4"],
    ["Layer 1.B", "Layer 2.B", "Layer 3", "Layer 4"]
]

1.尝试使用嵌套for循环创建嵌套字典(无法确定如何追加到字典)
1.已尝试使用递归(尝试通过每个字符串的每个元素迭代dict(zip(keys, dictionary) for keys in product(*dictionary2))、dict或zip)
1.尝试使用lambda函数
预期输出:请注意,只有第一层发生了变化,而内部结构是相同的。

[
    {"Layer 1.A":
        {
            "Layer 2.A": 
            {
                "Layer 3" : "Layer 4"
            },
            "Layer 2.B":
            {
                "Layer 3" : "Layer 4"
            }
        }
    },
    {"Layer 1.B":
        {
            "Layer 2.A": 
            {
                "Layer 3" : "Layer 4"
            },
            "Layer 2.B":
            {
                "Layer 3" : "Layer 4"
            }
        }
    }
]
dnph8jn4

dnph8jn41#

你已经生成了所有的排列。现在从这些排列中创建你的嵌套字典。为此,我们可以定义一个函数,它将接受原始字典、键列表和要在该嵌套键处设置的值。如果键不存在,则创建该键并将其值设置为新字典

def nested_set(obj, keys, value):
    for key in keys[:-1]:
        try:
            # Drill down until the penultimate key
            obj = obj[key]
        except KeyError:
            obj[key] = {}
            obj = obj[key]
    # Set value of last key
    obj[keys[-1]] = value

例如,对空的my_dict = dict()执行nested_set(my_dict, ['a', 'b', 'c'], 'd'),结果如下:

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

知道了这一点,你就可以这样使用你的排列列表:

perms = [
    ["Layer 1.A", "Layer 2.A", "Layer 3", "Layer 4"],
    ["Layer 1.A", "Layer 2.B", "Layer 3", "Layer 4"],
    ["Layer 1.B", "Layer 2.A", "Layer 3", "Layer 4"],
    ["Layer 1.B", "Layer 2.B", "Layer 3", "Layer 4"]
]

my_dict = dict()
for p in perms:
    nested_set(my_dict, p[:-1], p[-1])

这几乎可以得到你想要的结果:

{
    'Layer 1.A': {
        'Layer 2.A': {
            'Layer 3': 'Layer 4'
        },
        'Layer 2.B': {
            'Layer 3': 'Layer 4'
        }
    },
    'Layer 1.B': {
        'Layer 2.A': {
            'Layer 3': 'Layer 4'
        },
        'Layer 2.B': {
            'Layer 3': 'Layer 4'
        }
    }
}

将其转换为所需列表很容易:

result = [{k: v} for k, v in my_dict.items()]

其给出:

[
    {
        'Layer 1.A': {
            'Layer 2.A': {
                'Layer 3': 'Layer 4'
            },
            'Layer 2.B': {
                'Layer 3': 'Layer 4'
            }
        }
    },
    {
        'Layer 1.B': {
            'Layer 2.A': {
                'Layer 3': 'Layer 4'
            },
            'Layer 2.B': {
                'Layer 3': 'Layer 4'
            }
        }
    }
]
j2qf4p5b

j2qf4p5b2#

这似乎是递归解决方案的一个自然问题。

def Cartesian(theList):
    if len(theList) == 2:
        result = [ [x,y] for x in theList[0] for y in theList[1] ]
        return result 
    else:
        result = [[x,y] for x in theList[0] for y in Cartesian(theList[1:])]
        return result

这个实现将返回一个具有您正在寻找的嵌套结构的列表。我真的不太了解如何将结果格式化为JSON。

相关问题