我有一个列表的列表,我想得到一个字典的字典:
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)
尽量避免为变量使用内置名称。 list
和 dict
都代表各自类的构造函数,它们在您的程序中不再可用。
关于python - 将嵌套列表转换为嵌套字典的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66204267/