python - 将嵌套列表转换为嵌套字典的递归函数

标签 python

我有一个列表的列表,我想得到一个字典的字典:

import json

list = [
        ['1', '2', '3'],
        ['a', 'b'],
        ['I', 'II'],
        ['A', 'B', 'C'],
        ['A', 'B', 'D']
    ]

dict = {}  
    
for val in list:
    count = len(val)
    if val[0] not in dict:
        dict[val[0]] = {}
    if count == 3:
        if val[1] not in dict[val[0]]:
            dict[val[0]][val[1]] = {}
        if val[2] not in dict[val[0]][val[1]]:
            dict[val[0]][val[1]][val[2]] = ''
    else:
        if val[1] not in dict[val[0]]:
            dict[val[0]][val[1]] = ''
            
print (json.dumps(dict, sort_keys=True, indent=4))

输出:

{
    "1": {
        "2": {
            "3": ""
        }
    },
    "A": {
        "B": {
            "C": "",
            "D": ""
        }
    },
    "I": {
        "II": ""
    },
    "a": {
        "b": ""
    }
}

所以它适用于列表中的 2 或 3 个元素,但如果我有更多(随机)列表元素,我必须有某种递归函数,这是我想不到的。

最佳答案

这里没有真正需要递归函数(除非它是一个要求)。您也不需要关心列表的大小或数量。只需遍历每个列表,同时随时为内部字典保留更新的引用。

您还可以使用 setdefault以避免检查 key 是否已经存在。

d = {}
for sub in l:
    inner = d
    for elem in sub[:-1]:
        inner = inner.setdefault(elem, {})
        
    inner[sub[-1]] = ""

如果出于某种原因你真的想把它作为一个递归函数,那么下面是一个等价的版本。它从一个基本字典开始,每次调用都会创建一个内部字典,下一个调用会沿着字典的一个级别向下传递并传递列表的其余部分。基本情况是列表只有一个元素,因此使用字符串而不是字典。同样,为简单起见,使用了 setdefault:

def create_dict(l, d):
    if len(l) == 1:
        d[l[0]] = ""
    else:
        d = d.setdefault(l[0], {})
        create_dict(l[1:], d)

d = {}
for sub in l:
    create_dict(sub, d)

尽量避免为变量使用内置名称。 listdict 都代表各自类的构造函数,它们在您的程序中不再可用。

关于python - 将嵌套列表转换为嵌套字典的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66204267/

相关文章:

python - 如何正确读取groupby结果生成的csv文件?

python - 如何使仿射变换矩阵成为透视变换矩阵?

python - 我们如何改变当前的 __main__

python - 现在删除的模块 'nltk.model.NGramModel' 是否有替代品?

Python:如何阻止线程/多处理使用 100% 的 CPU?

python - 从 sklearn 的 MLPClassifier 中检索最终的隐藏激活层输出

python - 如何安装旧版本的pytorch

python - python中的简单forvalues循环?

python - 如何确定哪条回归曲线拟合得更好? PYTHON

python - 如何使用python-docx搜索和替换word文档中的单词/文本