将多个列表转换为嵌套词典

2024-10-01 17:35:27 发布

您现在位置:Python中文网/ 问答频道 /正文

abc/pqr123/xy2/yes//T  
abc/pqr245/kl3/yes//T  
abc/ijk123/op5/yes//T  
abc/pqr245/kl4/yes//T

这些是我要转换为嵌套的输入值字典。每个价值,例如 abc,pqr123,xy2,是的,T 表示产品的名称。在

我的输出应该如下所示:

^{pr2}$

所以我需要一个包含所有唯一值的嵌套字典,并且字典的最后一个键应该有一个空列表值。在

下面是我的代码片段,它生成了我需要的输出,但我想更动态地执行它,因此它甚至是最适合的 如果输入的长度增加或缩小。请告诉我是否有更好的办法来解决这个问题。在

data_dict={}
for item in meta_line.split(','):
    item = item.replace('//','/')
    item = str(item) 
    item = item.split('/')
    if item[0] == "":
       continue  

    if item[0] not in data_dict.keys():
       data_dict[item[0]] = {}
    if item[1] not in data_dict[item[0]].keys():
       data_dict[item[0]][item[1]] = {}
    if item[2] not in data_dict[item[0]][item[1]].keys():
       data_dict[item[0]][item[1]][item[2]] = {}
    if item[3] not in data_dict[item[0]][item[1]][item[2]].keys():
       data_dict[item[0]][item[1]][item[2]][item[3]] = {}
    if item[4] not in data_dict[item[0]][item[1]][item[2]][item[3]].keys():
       data_dict[item[0]][item[1]][item[2]][item[3]][item[4]] = []

Tags: indataif字典notkeysitemdict
2条回答

可以在循环中使用^{}方法来构建嵌套字典。我将使用^{}模块来显示输出。请注意,pprint.pprint在计算输出之前对字典键进行排序。在

from pprint import pprint

data = '''\
abc/pqr123/xy2/yes//T
abc/pqr245/kl3/yes//T
abc/ijk123/op5/yes//T
abc/pqr245/kl4/yes//T
'''.splitlines()

nested_dict = {}

for row in data:
    d = nested_dict
    keys = [s for s in row.split('/') if s]
    for key in keys[:-1]:
        d = d.setdefault(key, {})
    d[keys[-1]] = []

pprint(nested_dict)

输出

^{pr2}$

你可能想要一些不依赖于大量嵌套方括号的东西。使用对可变对象的引用可以很好地解决这个问题。在

meta_line = 'abc/pqr123/xy2/yes//T,abc/pqr245/kl3/yes//T,abc/ijk123/op5/yes//T,abc/pqr245/kl4/yes//T'

data = dict()
for item in meta_line.split(','):
    dref = data
    dict_tree = item.strip().replace('//', '/').split('/')
    for i, val in enumerate(dict_tree):
        if val in dref:
            pass
        elif i != len(dict_tree) - 1:
            dref[val] = dict()
        elif i == len(dict_tree) - 1:
           dref[val] = list()
        dref = dref[val]

内环的每次迭代都会将引用dref下移一级,然后在外循环的每次迭代中重置它。最后,data应该包含嵌套的dict

编辑:对不起,我刚注意到你希望最后一级是一个列表。这是解决该问题的一种解决方案,但不是最好的(如果某个位置上有一个列表,而后面的数据条目希望它是dict,则会产生错误)。我可能会选择构建我的嵌套dict,然后递归地用空列表替换任何空dict来避免这个问题。在

相关问题 更多 >

    热门问题