我有一个列表列表,我想要一个字典词典:
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
来避免检查密钥是否已经存在。
d = {}
for sub in l:
inner = d
for elem in sub[:-1]:
inner = inner.setdefault(elem, {})
inner[sub[-1]] = ""
如果由于某种原因您确实希望将此作为递归函数,则以下为等效版本。它从一个基本的dict开始,并且每次调用都会创建一个内部dict,下一个调用会降到该dict的一个级别上并传递列表的其余部分。基本情况是列表包含一个元素时,使用字符串而不是字典。再次,为简单起见,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
表示各个类的构造函数不属于任何在你的程序更可用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句