如何将mindmap csv转换为python dict和find key

2024-04-25 23:44:48 发布

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

这是思维导图
enter image description here

相应的csv文件是
history,Africa,Egyptian,pyramid ,Asia,Ancient India,Caste System ,,,Buddhism ,Eourp,Greece,xxx ,,Rome,yyy ,,,zzzz 我想把csv文件转换成类似json的结构

{
    'history': [
        {
            'Africa': [
                {
                    'Egyptian': [{'pyramid': []}]
                }
            ]
        },
        {
            'Asia': [
                {
                    'Ancient India': [
                        {'Caste System': []},
                        {'Buddhism': []}
                    ]
                }
            ]
        },
        ...
    ]
}

最后是一个查找键并打印该键路径的函数 e、 g.find('Buddhism') -> history.Asia.Ancient India.Buddhism

我试过树,但我不知道如何做到这一点。你知道吗


Tags: 文件csvpyramidsystemhistory思维导图india
1条回答
网友
1楼 · 发布于 2024-04-25 23:44:48

这里有一个可行的解决方案:

# Load your string into list of list
m = []
for each in s.split('\n'):
    l = each.split(',')
    m.append(l)

# Create dict object that you want.
master = {}
level_indexes = [-1]*10
for i in range(len(m)):
    level = len([e for e in m[i] if e == ''])
    level_indexes[level] = i
    level_indexes[level+1:] = [-1]*(10-level-1)
    if level == 0:
        head = master
        for each in m[i]:
            head[each] = {}
            head = head[each]
    else:
        head = master
        indexes = []
        for j, e in enumerate(level_indexes[:level]):
            if e is not -1:
                indexes.append(j)
        indexes.append(level)
        last = []
        for j in range(len(indexes)-1):
            last.extend(m[level_indexes[j]][indexes[j]:indexes[j+1]])
        for j in range(level):
            head = head[last[j]]
        for j in range(level, len(m[i])):
            head[m[i][j]] = {}
            head = head[m[i][j]]    

这将创建一个嵌套字典-master

{'history': {'Africa': {'Egyptian': {'pyramid': {}}},
             'Asia': {'Ancient India': {'Buddhism': {}, 'Caste System': {}}},
             'Eourp': {'Greece': {'xxx': {}},
                       'Rome': {'yyy': {}, 'zzzz': {}}}}}

如果你稍微调整一下,你可以把所有的东西都列在清单上,但这会让事情变得更复杂:

master = []
level_indexes = [-1]*10
for i in range(len(m)):
    level = len([e for e in m[i] if e == ''])
    level_indexes[level] = i
    level_indexes[level+1:] = [-1]*(10-level-1)
    if level == 0:
        head = master
        for each in m[i]:
            head.append({each: []})
            head = head[-1][each]
    else:
        head = master
        indexes = []
        for j, e in enumerate(level_indexes[:level]):
            if e is not -1:
                indexes.append(j)
        indexes.append(level)
        last = []
        for j in range(len(indexes)-1):
            last.extend(m[level_indexes[j]][indexes[j]:indexes[j+1]])
        for j in range(level):
            head = head[-1][last[j]]
        for j in range(level, len(m[i])):
            head.append({m[i][j]: []})
            head = head[-1][m[i][j]]

输出:

[{'history': [{'Africa': [{'Egyptian': [{'pyramid': []}]}]},
              {'Asia': [{'Ancient India': [{'Caste System': []},
                                           {'Buddhism': []}]}]},
              {'Eourp': [{'Greece': [{'xxx': []}]},
                         {'Rome': [{'yyy': []}, {'zzzz': []}]}]}]}]

相关问题 更多 >