【问题标题】:converting a flat list to a nested dictionary based on items from the list根据列表中的项目将平面列表转换为嵌套字典
【发布时间】:2016-09-04 15:10:41
【问题描述】:

例如,我有一个这样的平面列表:

[' a',
'  aa1',
'   aaa1',
'   aaa2',
'   aaa3',
'   aaa4',
'   aaa5',
'  aa2',
'   aaa6',
'   aaa7',
'   aaa8',
'   aaa9',
'   aaa10',
' b',
'  bb1',
'   bbb1',
'   bbb2',
'   bbb3',
'  bb2',
'   bbb4',
'   bbb5',
'   bbb6',
'  bb3',
'   bbb7',
'   bbb8',
'   bbb9',
'   bbb10']

我需要像这样转换成嵌套字典:

{'a': {'aa1': ['aaa1', 'aaa2', 'aaa3', 'aaa4', 'aaa5'],
       'aa2': ['aaa6', 'aaa7', 'aaa8', 'aaa9', 'aaa10']},
 'b': {'bb1': ['bbb1', 'bbb2', 'bbb3'],
       'bb2': ['bbb4', 'bbb5', 'bbb6'],
       'bb3': ['bbb7', 'bbb8', 'bbb9', 'bbb10']}}

列表中的每个项目都包含空格,只有一个空格的项目被分配为嵌套字典的顶部键,有两个空格的项目被分配为上一个项目的第二级键,然后是三个空格items 是前一个键的所有值。

【问题讨论】:

标签: python list dictionary


【解决方案1】:

我认为空格只会让列表变得尴尬,你不一定需要它们来实现你想要的。

首先,strip 列表项中的所有空格,然后从collections.defaultdict 开始构建字典。执行您打算对空格执行的操作的逻辑是re.sub。应用于清除所有数字,替换后的字符串长度现在可以用来确定它在字典中的位置:

import re
from pprint import pprint
from collections import defaultdict

# remove all spaces from list items
lst = map(str.strip, lst)

d = defaultdict(lambda: defaultdict(list))

for i in lst:
    j = re.sub('\d+', '', i)
    if len(j) == 1:
        k1 = i
    elif len(j) == 2:
        k2 = i
    else:
        d[k1][k2].append(i)

pprint(d)
#{'a': {'aa1': ['aaa1', 'aaa2', 'aaa3', 'aaa4', 'aaa5'],
#       'aa2': ['aaa6', 'aaa7', 'aaa8', 'aaa9', 'aaa10']},
# 'b': {'bb1': ['bbb1', 'bbb2', 'bbb3'],
#       'bb2': ['bbb4', 'bbb5', 'bbb6'],
#       'bb3': ['bbb7', 'bbb8', 'bbb9', 'bbb10']}}

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2020-09-03
    • 1970-01-01
    • 2017-07-29
    • 2011-08-21
    相关资源
    最近更新 更多