Python 生成嵌套列表Django

Python 生成嵌套列表Django,python,django,Python,Django,我有一个这样的电子表格。我必须生成一个嵌套列表。如果父id为0,则它将没有父id,即根id 结果列表如下所示 请告诉我怎么做。多亏了将元组列表转换为树结构的一般方法是迭代并创建父/子关系: data = [(newid, parentid, name), ...] # getting the data into this format left as an excercise for the reader # convert data into tree-structure tree =

我有一个这样的电子表格。我必须生成一个嵌套列表。如果父id为0,则它将没有父id,即根id

结果列表如下所示


请告诉我怎么做。多亏了

将元组列表转换为树结构的一般方法是迭代并创建父/子关系:

data = [(newid, parentid, name), ...]  # getting the data into this format left as an excercise for the reader

# convert data into tree-structure
tree = {
    newid: {
        "parentid": parentid, 
        "name": name, 
        "parent": None, 
        "children": []
    } for newid, parentid, name in data }

for newid, item in data.items():
    node = tree[newid]
    if node['parentid'] is not None:
        parent = node['parent'] = tree[node['parentid']
        parent.children.append(node)
然后,您可以通过以下方式找到根节点:

roots = [node for node in tree.values() if node.parent is None]
您可以创建一个模板标记来帮助显示这些内容,也可以在javascript中进行,例如,如果您将
作为
json传递给模板。转储(根)


(函数drawroots(位置,根){
let draw_leaf=函数(n){
返回“
  • +n.name+”
  • ”; }; 设draw_子树=函数(n){ 让res=“
  • ”+n.name+”; n、 forEach(c=>{res+=draw_node(c);}); res+=“
  • ”; }; 设draw_节点=函数(n){ return(node.children.length==0)?draw_叶(n):draw_子树(n); }; $(位置)。附加(“”); roots.forEach(r=>{ $(pos).append(draw_节点(r)); }); $(位置)。附加(“”); }(#mylst',{{roots}});

    在js中有很多更好的方法可以做到这一点,但这应该让你开始了。

    你自己尝试过什么吗?如果没有,试着开始,然后在遇到问题时寻求帮助。给我一些提示,开始将所有元素从电子表格拉到某个列表或字典或python中的任何东西,然后想想该怎么做一旦你有了这个清单
    <div id="mylst"></div>
    <script>
    (function drawroots(pos, roots) {
    
        let draw_leaf = function (n) {
            return '<li> + n.name + '</li>';
        };
    
        let draw_subtree = function (n) {
            let res = "<li>" + n.name + "<ol>";
            n.children.forEach(c => {res += draw_node(c); });
            res += "</li></ol>";
        };
    
        let draw_node = function (n) {
            return (node.children.length === 0) ? draw_leaf(n) : draw_subtree(n);
        };
    
        $(pos).append('<ol>');
        roots.forEach(r => {
            $(pos).append(draw_node(r));
        });
        $(pos).append('</ol>');
    }('#mylst', {{roots}});
    </script>