【问题标题】:Modified Preorder Tree Traversal to Python structure修改前序树遍历到 Python 结构
【发布时间】:2013-01-12 07:47:30
【问题描述】:

您好,我正在尝试表示修改后的预排序树遍历 作为一个 Python 结构,我可以输出到 json,因为我当前的目标是在 jstree 中显示树

假设我有一张如图所示的表格 http://imrannazar.com/Modified-Preorder-Tree-Traversal(在我的情况下,每一行也有一个 parent_id)像这样

    Node ID   Name       Left MPTT value     Right MPTT value       ParentID
     1       (Root)             1                 16                   -1
     2       Articles           2                 11                    1
     5       Fiction            3                 8                     2
     7       Fantasy            4                 5                     5
     8       Sci-fi             6                 7                     5
     6       Reference          9                 10                    2
     3       Portfolio          12                13                    1
     4       Contact            14                15                    1

jstree的Json格式是这样的

    [
      {
       "data" : "Root",
       "children" : [ 
           {
              "data":"Articles",
               "children : [
                             {"data":"Fiction"},
                             {"data":"Reference"}
                            ]
           },
           {"data":"Portfolio"},
           {"data":"Contact"}]
      },
    ]

如何将上表转换为 Python 格式以 输出这个json。

我想过以某种方式使用嵌套字典 如下

    class NestedDict(dict):
        def __missing__(self, key):
            return self.setdefault(key, NestedDict())

不确定我需要的算法。

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: python jstree mptt


    【解决方案1】:

    你真的应该尝试自己做,展示你做了什么,哪里没用。但是我有几分钟的空闲时间,所以...

    要解析表格,您可以使用csv 模块。我会把它留给你。

    可能不是最佳解决方案,但可以这样做:

    datain = (
        (1,'Root',1,16,-1),
        (2,'Articles',2,11,1),
        (5,'Fiction',3,8,2),
        (7,'Fantasy',4,5,5),
        (8,'Sci-fi',6,7,5),
        (6,'Reference',9,10,2),
        (3,'Portfolio',12,13,1),
        (4,'Contact',14,15,1),
        )
    
    def convert_to_json(data):
        node_index = dict()
        parent_index = dict()
        for node in data:
            node_index[node[0]] = node
            parent_index.setdefault(node[4],[]).append(node)
    
        def process_node(index):
            result = { 'data' : node_index[index][1] }
            for node in parent_index.get(index,[]):
                result.setdefault('children',[]).append(process_node(node[0]))
            return result
    
        node = process_node(1)
        return [node]
    

    返回:

    [
        {
            'data': 'Root',
            'children': [
                {
                    'data': 'Articles',
                    'children': [
                        {
                            'data': 'Fiction',
                            'children': [
                                { 'data': 'Fantasy' },
                                { 'data': 'Sci-fi' }
                                ]
                        },
                        { 'data': 'Reference' }
                    ]
                }, 
                { 'data': 'Portfolio' },
                { 'data': 'Contact' }
            ]
        }
    ]
    

    【讨论】:

    • 谢谢。我确实尝试了比几分钟更长的时间。我让自己陷入了正确的混乱之中。谢谢
    • 最后我稍微修改了它以允许添加兄弟姐妹。我最初是在尝试一种非递归方式,这就是我遇到麻烦的原因。如果有人有非递归解决方案,我很乐意出于好奇而看到它。
    • @isedev,我有什么办法可以给你一些关于这个算法的赏金积分吗?它非常棒,完全是 Python 的
    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多