例如,我有一个这样的平面列表:
[' 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是前一个键的所有值。
答案 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']}}