代码之家  ›  专栏  ›  技术社区  ›  Chweng Mega

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

  •  0
  • Chweng Mega  · 技术社区  · 6 年前

    这是思维导图
    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': []}
                        ]
                    }
                ]
            },
            ...
        ]
    }
    

    最后是一个函数来查找密钥并打印该密钥的路径 例如 find('Buddhism') -> history.Asia.Ancient India.Buddhism

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rocky Li    6 年前

    以下是一个有效的解决方案:

    # 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': []}]}]}]}]