在Python中打印列表的非递归方法

2 投票
5 回答
534 浏览
提问于 2025-04-15 13:04

有没有办法以非递归的方式来完成以下操作:

my_list = [
    "level 1-1",
    "level 1-2",
    "level 1-3",
        [
            "level 2-1",
            "level 2-2",
            "level 2-3",
            [
                "level 3-1",
                "level 3-2"
            ]
        ],
    "level 1-4",
    "level 1-5"
    ]


def print_list(the_list, indent_level=0):
    for item in the_list:
        if isinstance(item, list):
            print_list(item, indent_level + 1)
        else:
            print "\t" * indent_level, item


print_list(my_list)

5 个回答

2

这是马丁·洛维斯版本的一个变种,它使用了 for/else 结构,而不是手动捕捉 StopIteration,同时用 len(stack) 来代替跟踪缩进级别。

def print_list(the_list):
    stack = [iter(the_list)]
    while stack:
        for item in stack[-1]:
            if isinstance(item, (list, tuple)):
                stack.append(iter(item))
                break
            else:
                print '\t' * (len(stack)-1), item
        else:
            stack.pop()
2

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是因为我们使用的工具和环境设置不对。解决这些问题的第一步就是要仔细检查代码,看看有没有拼写错误、漏掉的符号或者逻辑上的问题。

另外,了解你使用的编程语言和工具的基本知识也很重要。这样可以帮助你更快地找到问题所在。如果你不确定某个功能是怎么用的,可以查阅相关的文档或者在网上搜索一下,通常会找到很多有用的信息。

最后,记得多和其他程序员交流,分享你的问题和解决方案。这样不仅能帮助你更快地解决问题,还能让你学到更多的知识。

def print_list(the_list, indent_level=0):
    stack = [iter(the_list)]
    while stack:
        try:
            item = stack[-1].next()
        except StopIteration:
            stack.pop()
            indent_level -= 1
            continue
        if isinstance(item, list):
            indent_level += 1
            stack.append(iter(item))
        else:
            print "\t" * indent_level, item
4

在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后在另一个地方使用这些信息。这个过程就像是把水从一个桶倒到另一个桶。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者我们需要对数据进行一些处理才能使用。这就像是我们需要先把水过滤一下,才能倒进另一个桶。

在这个过程中,我们可能会使用一些工具或者方法来帮助我们完成任务。这些工具就像是我们用来过滤水的网子,能够让我们更方便地处理数据。

总之,编程就像是在做一些搬运和处理数据的工作,虽然有时候会遇到困难,但只要找到合适的方法,就能顺利完成任务。

stack = [(my_list, -1)]
while stack:
    item, level = stack.pop()

    if isinstance(item, list):
        for i in reversed(item):
            stack.append((i, level+1))
    else:
        print "\t" * level, item

撰写回答