如何生成<;ul>&书信电报;李>;没有使用python或其他语言递归的树?

如何生成<;ul>&书信电报;李>;没有使用python或其他语言递归的树?,python,tree,Python,Tree,输出: class tree: def __init__(self, name='a', childs=[]): self.name = name self.childs = childs 介绍 子介绍 单元1 可能是这样的: <ul> <li> Introduction <ul> <li>Sub Intro</li> </ul&

输出:

class tree:
    def __init__(self, name='a', childs=[]):
        self.name = name
        self.childs = childs
  • 介绍
    • 子介绍
  • 单元1

可能是这样的:

<ul>
    <li>
    Introduction
    <ul>
        <li>Sub Intro</li>
    </ul>
    </li>

    <li>Module 1</li>
</ul>
NEW=object()
END=object()
类树:
定义初始化(self,name='a',childs=[]):
self.name=名称
self.childs=childs
定义(自我):
缩进=0
结果=[]
对于我在self.childs:
如果我是新来的:
result.append(“%s
    \n”“(“”*缩进)) 缩进+=1 以利夫一世结束: 缩进-=1 结果.追加(“%s
\n“%”(“”*缩进)) 其他: 结果.append(“%s
  • %s
  • \n“(“”*缩进,i)) 返回“”。加入(结果) 打印树('test',[NEW',Introduction',NEW',Sub Intro',END',Module 1',END])
    要生成嵌套列表而无需递归,只需跟踪嵌套级别,在深入嵌套级别时递增,在向上遍历时递减即可

    处理结束标记之类的事情的自然方法是维护一个简单的堆栈(Python列表),并在将相应的开始标记插入输出流时将结束标记推送到堆栈上。然后,当您遍历出任何嵌套级别时,都会弹出这些

    你没有说你的输入格式。。。让我们假设它看起来像:

    NEW=object()
    END=object()
    
    class tree:
        def __init__(self, name='a', childs=[]):
            self.name = name
            self.childs = childs
    
        def __str__(self):
            indent=0
            result=[]
            for i in self.childs:
                if i is NEW:
                    result.append('%s<ul>\n'%('    '*indent))
                    indent+=1
                elif i is END:                
                    indent-=1
                    result.append('%s</ul>\n'%('    '*indent))
                else:
                    result.append('%s<li>%s</li>\n'%('    '*indent, i))
            return ''.join(result)
    
    
    
    print tree('test', [NEW, 'Introduction', NEW, 'Sub Intro', END, 'Module 1', END])
    
    = Introduction
    == Sub Intro
    = Module 1
    
    然后是:

    NEW=object()
    END=object()
    
    class tree:
        def __init__(self, name='a', childs=[]):
            self.name = name
            self.childs = childs
    
        def __str__(self):
            indent=0
            result=[]
            for i in self.childs:
                if i is NEW:
                    result.append('%s<ul>\n'%('    '*indent))
                    indent+=1
                elif i is END:                
                    indent-=1
                    result.append('%s</ul>\n'%('    '*indent))
                else:
                    result.append('%s<li>%s</li>\n'%('    '*indent, i))
            return ''.join(result)
    
    
    
    print tree('test', [NEW, 'Introduction', NEW, 'Sub Intro', END, 'Module 1', END])
    
    = Introduction
    == Sub Intro
    = Module 1
    
    def pref_txt_to_ul(txt):
    嵌套=0
    关闭标签=列表()
    对于txt中的x:
    如果len(x.split())<2:
    持续
    前缀,内容=x.split(无,1)
    nd=len(前缀)##新深度
    断言前缀==“=”*nd##第一个“单词”是all=个字符
    如果nd>嵌套:
    打印“\n”、“嵌套*4”、“嵌套”*(nd-嵌套),##将新的开始标记推入输出
    结束标记。附加(“”*(nd-嵌套))35;#推送结束标记以备以后使用
    elif nd<嵌套:
    对于范围内的x(嵌套-nd):
    如果关闭\u标签:
    打印“*nesting*4,closing_tags.pop(),##pop closing tags
    嵌套=nd
    打印“\n”和“*nesting*4”,
  • %s
  • %content,#推出此项目(在新深度) ##完成所有文本后: 关闭\u标记时: 打印结束标记。pop(),#弹出剩余的结束标记
    。。。应该做到这一点(尽管相当粗糙)

    请注意,我实际上并没有强制执行一个规则,即只应以1的增量增加嵌套级别。在一个步骤中从=到=====的退化输入将生成无关的标记,并将无关的标记推入关闭堆栈

    注意:我只回答了一个明确的问题,即如何在没有递归的情况下处理嵌套。从您的示例(使用HTML无序列表标记)可以推断,您的真正目标是生成有效的HTML。在这种情况下,有大量的Python工具比我在本例中所做的任何粗糙的文本挖掘都更适合该任务。在:Python“generate HTML”上进行雅虎或谷歌搜索,将返回数千页关于执行此操作的方法和许多可用工具的页面


    (我记得几年前我使用过HTMLgen,我看到它仍然可以作为Debian软件包使用,但它似乎已经从PyPI…Python软件包索引中脱落了。毫无疑问,那里有更新得多的软件包。大多数人似乎使用了模板引擎,例如Genshi或Mako).

    你有什么特别的原因需要非递归地这样做吗?你的英语很好;然而,你的问题很模糊。你是在问如何使用
    类来构建一个`
      ..
    '结构,还是在问这个类是否正确?我的问题是如何使用树类来构建一个`
      ..
    '结构这是一个有趣的问题-你可以使用累加器来实现它,但是Python实际上没有一个数据结构使它高效,因为你需要在中间插入。也许使用deque?但这假设他的输入是连续的,而不是树。如果他真的有一个树数据结构作为输入,这是没有帮助的。在不递归的情况下创建树的困难部分是遍历树-在这里您不必这样做。