根据列表中的项目将平面列表转换为嵌套字典

时间:2016-09-04 15:10:41

标签: python list dictionary

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

[' 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是前一个键的所有值。

1 个答案:

答案 0 :(得分:2)

我认为这些空间只会使列表变得笨拙,你不一定需要它们才能达到你想要的效果。

首先,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']}}