嵌套列表的非递归遍历——在Python中构建类似的嵌套列表

2024-05-03

我需要遍历一个嵌套列表,处理每个非列表项str()并返回保持结构的类似列表。使用递归,这会相当容易,但我需要以这种迭代的方式进行。下面是我的尝试while loop:

def myiter(e):
    a = [e] # initial list
    c = [[]] # final result
    get_last = lambda x: x[len(x)-1] # get ref to the final sublist
    l = get_last(c)
    while a:
        b = a.pop(0)
        if isinstance(b, list):
            # if there are more items to process in the original list
            if a:
                a = b + a
            # else extend original list to process sublists
            else:
                a.extend(b)
            # make a new sublist ref
            l = get_last(c)
            c.append([])
        else:
             # walk and process every item in the nested list
             l.append(str(b))
    return c

正如输出所示,这存在几个问题:

myiter([1, [2, [3, 4], 5]]) # [['1'], ['2'], ['3', '4', '5'], []]

期望的结果是:

['1', ['2', ['3', '4'], '5']]

有没有一种简单的迭代方法可以用Python来完成这个任务?


这似乎有效:

def stringify(a):
    a = a[:]                           # Make copy of what was passed in.
    res = []                           # Initialize result list.
    my_stack = []                      # Initialize our own LIFO stack.
    while (a or my_stack):                            # While a or my_stack is non-empty
        if (a):
            elem = a.pop(0)
            if (not isinstance(elem, list)):          # If popped elem is not a list
                res.append(str(elem))                 # Append stringified elem to res
            else:
                my_stack.append((a, res))           # Push some stuff, to resume working upon later.
                a = elem                            # Let's start iterating on this inner list
                res = []                            # This inner list needs a clean res, to start with.
        else:                                       # my_stack is non-empty
            a, res_prev = my_stack.pop()   # Pop some stuff, to resume, work on outer list
            res_prev.append(res)           # First, append our just-completed inner list.
            res = res_prev
    return res

Output:

a = [1, [2, [3, 4], 5]]
stringify(a)
['1', ['2', ['3', '4'], '5']]

通过了以下测试用例:

a = [1, [[[2]]]]
a = [[[1]], 2]
a = [1, [[2]]]
a = [1, [2, [3, 4], 5], [6, [7, [8]]], 9]
a = [1, [2, [3, 4], 5]]
a = [1, 2, 3, 4, 5]

关于其工作原理的一些注意事项:

  1. If the pop在我们的名单上a产生一个整数,我们只需将字符串化的整数附加到res
  2. If the pop在我们的名单上a生成一个内部列表,我们需要在处理该内部列表之后出现的元素之前开始处理该内部列表。处理完内部列表后,我们必须回到剩余的未弹出元素a).
  3. 每当我们检测到当前列表a已经变得空虚,我们的res将指向等效的字符串化列表,现在是我们附加我们的res无论其(字符串化)外部列表是什么
  4. 为了处理每个遇到的内部列表,我们采用该内部列表作为新的a(分配a = elem),以及一个空列表作为我们的新列表res (res = [])。在此之前,我们需要将当前的内容压入堆栈a以及我们目前的res
  5. 为什么是后进先出?好吧,这样看:无论被推动什么last onto my_stack表示我们当前正在处理的任何列表的直接外部列表(a).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套列表的非递归遍历——在Python中构建类似的嵌套列表 的相关文章

随机推荐

  • 如何删除列表中的重复值? [复制]

    这个问题在这里已经有答案了 可能的重复 如何从 Python 列表中删除重复项同时保持顺序 https stackoverflow com questions 480214 how do you remove duplicates from
  • 如何在c#中使用net user

    我正在尝试将 net user 与 c 一起使用 System Diagnostics ProcessStartInfo proccessStartInfo new System Diagnostics ProcessStartInfo n
  • 为什么map.insert()方法会调用复制构造函数两次?

    我正在创建自定义类Node为了使用二叉树实现map
  • 使用 gevent 在应用程序上下文之外工作的 Flask 蓝图

    我正在尝试通过 Flask mail 使用 gevent 在 Flask 中异步发送电子邮件 我正在 在应用程序上下文之外工作 我知道 app app context 但我无法让它与我的设置一起使用 我的应用程序是使用这样的应用程序工厂创建
  • Flutter:酒吧失败

    Flutter 项目向我显示警告 Packages get has not been run以及建议的解决方案 获取依赖项 升级依赖项 Ignore 正如建议的Darky https stackoverflow com users 8394
  • PHP 正则表达式修复被黑的 WordPress 网站

    我有一个客户安装了多个 WordPress 但他没有保持最新状态 结果 他被黑了 当我试图找出黑客是如何进入并永久解决问题时 我正在尝试创建一个脚本来快速 自动地修复它们 我找到了这个脚本 它可以满足我的要求 http designpx c
  • Yml配置文件与Spring boot的“继承”

    我在网上找不到直接答案 Spring Boot 的 yml 文件是否相互 继承 我的意思是如果我有 application yml其中有 server port 80 host foo and application profile1 ym
  • 在 HTTPS 而不是 HTTP 中启动 React 应用程序

    我想知道如何启动一个使用 https 而不是 HTTP 中的 create react app 命令制作的 React 应用程序 使用根 SSL 证书之类的东西 生成密钥 openssl genrsa des3 out rootCA key
  • 在 C# 中使用逗号和小数格式化数字

    我需要显示一个带有逗号和小数点的数字 例如 情况 1 十进制数是 432324 没有逗号或小数点 需要将其显示为 432 324 00 不 432 324 情况 2 十进制数是 2222222 22 没有逗号 需要将其显示为 2 222 2
  • 用 Chronos 取代 Celerybeat

    成熟到什么程度Chronos http airbnb github io chronos 它是像 celery beat 这样的调度程序的可行替代品吗 现在 我们的调度实现了一个定期的 心跳 任务 该任务检查 未完成的 事件 并在过期时触发
  • 无法锚定到不是父级或同级 QML QtQuick 的项目

    我正在使用 QML 开发 python 桌面应用程序 我的 QML 文件中有这个 SplitView anchors fill parent orientation Qt Horizontal Rectangle color 272822
  • 如何查找 DICOM 研究中的图像数量?

    是否可以通过读取该研究中文件的 DICOM 标头来查找 DICOM 研究中的图像数量 我正在开发一个 Java 应用程序 该应用程序接收来自不同来源的 DICOM 研究 我只是想检查是否已完全收到研究 不幸的是 我不能依赖阅读 DICOMD
  • 如何在 Node CLI 程序中使用 babel?

    我正在 Node 中编写一个小型 CLI 工具 并希望使用 ES6 来实现 index js 看起来像 usr bin env node require babel register module exports require app 我
  • 如何创建一个自定义中继器,根据属性显示页眉、页脚?

    我想创建一个根据属性显示页眉 页脚的中继器 仅当DataSource是空的 public class Repeater System Web UI WebControls Repeater public bool ShowHeaderOnE
  • 由于对象的当前状态,操作无效 - Linq on List

    对列表运行 Linq 查询时会引发此错误 我使用 Unity3D 3 0 和 C Unity3D 使用 Mono 2 6 据我所知 Unity3D是单线程的 它的工作原理是将继承基类的 脚本 c cs 文件 附加到 GameObject 此
  • 在 vim 中,+register 和 +register 与 .命令?

    我很难理解这个问题的解决方案维姆高尔夫挑战赛 http vimgolf com challenges 5192f96ad8df110002000002 最好的建议解决方案是 cw
  • Phonegap 之类的 Mac App Store 平台? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用phonegap 在iOS 本机应用程序中运行我的HTML JS 代码 有没有办法在 Mac
  • 线程终止时的 Java ExecutorService 回调

    我正在使用缓存线程池 ExecutorService 来运行一些异步后台任务 我提供了 ThreadFactory 它将线程分发给 ExecutorService 只要需要它们 我对缓存线程池的理解是 线程空闲 60 秒后 它会被 Exec
  • 如何在速度模板中显示图像

    如何在速度模板中显示此图像 显示图像需要什么配置吗 我有速度的java 配置 请帮我 提前致谢 非常感谢glw的热心回复 问题已经解决了 我忘记了电子邮件模板仅采用部署的实时图像路径 而不是像 src pageContext request
  • 嵌套列表的非递归遍历——在Python中构建类似的嵌套列表

    我需要遍历一个嵌套列表 处理每个非列表项str 并返回保持结构的类似列表 使用递归 这会相当容易 但我需要以这种迭代的方式进行 下面是我的尝试while loop def myiter e a e initial list c final