遍历并修改dict结构的树状列表

2023-11-21

我有一个如下所示的结构:

[ {'id': 4, 'children': None},
  {'id': 2, 'children': 
    [ {'id': 1, 'children':
        [ {'id': 6, 'children': None},
          {'id': 5, 'children': None} ]
      },
      {'id': 7, 'children':
        [ {'id': 3, 'children': None} ]
      }
    ]
  }
]

我还有一个选定的 ID 列表,[4, 5, 6, 7]。我想遍历列表并为列表中的每个对象添加一个selected值为1如果它被选中,并且0如果不是。

目前我正在使用此函数递归地执行此操作:

def mark_selected(tree, selected):
    for obj in tree:
        obj['selected'] = 1 if obj['id'] in selected else 0
        if obj['children'] is not None:
            obj['children'] = mark_selected(obj['children'], selected)
    return tree

这似乎工作正常,但我想知道是否有更聪明的方法来做到这一点,可能使用列表理解或生成器。

有人能为此想出更优雅的解决方案吗?


递归非常优雅。当您更改适当的结构而不是生成新序列时,列表推导式不适用。至于生成器,您可以编写 DFS 或 BFS 遍历器。

def dfs(nodes):
    if nodes is not None:
        for node in nodes:
            yield node
            yield from dfs(node['children'])

for node in dfs(tree):
    node['selected'] = node['id'] in selected

Python 3.3 及更高版本可以使用上面的递归产量(yield from句法)。早期版本会循环遍历递归结果,产生:

def dfs(nodes):
    if nodes is not None:
        for node in nodes:
            yield node
            for child in dfs(node['children']):
                yield child

如果要选择的 ID 列表很大,将其从列表转换为集合会提高性能,这将加快查找速度(node['id'] in selected).

selected = set(selected)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遍历并修改dict结构的树状列表 的相关文章

随机推荐

  • asp.net“已达到网络 BIOS 命令限制”ASP.NET 2.0 + 3.5

    我正在尝试在 ASP NET 2 0 3 5 中运行 tinyMCE 文本编辑器 但我的 web config 文件中出现以下错误 加载配置文件时发生错误 无法开始监视对 Visual Studio 2005 WebSites TinyMC
  • 如何将 NSRect 更改为 CGRect?

    void drawRect NSRect rect imgRect orgin NSZeroPoint imgRect size appleImage size drawRect self bounds appleRect drawInRe
  • Fragment.onCreateView 具有空容器

    以下代码在 Android 1 6 上运行 因此我使用片段的兼容性包 在下面的TestFragment是一个静态嵌套类 public class FragmentTestActivity extends FragmentActivity O
  • 补丁请求 Android Volley

    我目前正在一个项目中使用 Android 的 Volley 网络库 我已经从以下位置拉下了凌空的主分支https android googlesource com platform frameworks volley 所以我的库项目应该是最
  • R .libPaths() RStudio 和命令行 R 之间的区别

    当我从命令行运行 R 时 gt library ggplot2 gt path package ggplot2 1 home yang R x86 64 pc linux gnu library 2 13 ggplot2 gt libPat
  • 为 iOS(iPhone 和 iPad)制作两个故事板

    是否可以只制作一个应用程序 并在其中制作两个故事板 一个用于 iPhone 一个用于 iPad 我不喜欢在 iPad 上运行应用程序并单击 2x 按钮的想法 我的想法是创建两个故事板 并有一个入门课程 该课程将检查您使用的设备是 iPhon
  • 如何使用 Python 和 Gracenote 识别音乐样本?

    我最近发现了GNSDK Gracenote SDK 似乎提供了多种编程语言的示例 通过指纹识别音乐样本 然后请求其音频数据库获取相应的艺术家和歌曲标题 但文档太糟糕了 如何使用 Python 和 GNSDK 执行音频样本文件的识别 提供的文
  • SBT 0.10 和 IDEA 初学者指南

    我是 SBT 新手 不确定如何开始项目 有人可以向我指出创建 Hello World 类型项目的初学者指南 或者给我一些线索吗 我首选的 IDE 是 IDEA 我跑了sbt idea根据说明IDEA 插件页面 目前我有点困惑 因为 没有创建
  • 从 Rails 返回文件

    初学者铁路问题 如何从 Rails 中的控制器返回文件 我熟悉返回 渲染 JSON 对象 但是我从未返回 渲染带有任意扩展名的文件 从阅读周围所以听起来像render nothing gt true有帮助 我只是在寻找一些指导或相关文档 您
  • 如何使用 dplyr 编程语法来创建和计算变量名称

    我想使用 dplyr 编程语法动态输入变量名 但是 正如许多人所描述的那样 这可能非常令人困惑 我尝试过各种 quo enquo 的组合 等等都无济于事 这是我的代码的最简单形式 library tidyverse df lt tibble
  • 按指定顺序按 id 查找 ActiveRecord 对象的简洁方法

    我想获取给定 id 数组的 ActiveRecord 对象数组 我假设 Object find 5 2 3 将返回一个依次包含对象 5 对象 2 对象 3 的数组 但我得到的数组按对象 2 对象 3 对象 5 的顺序排列 ActiveRec
  • 使用 WinAPI 进行简单的 AES 加密

    我需要在我的 Qt C 应用程序中进行简单的单块 AES 加密 解密 这是一个 让诚实的人诚实 的实现 所以只是一个基本的encrypt key data 是必要的 我不担心初始化向量等 我的输入和密钥将始终恰好是 16 个字节 I d r
  • 在网络上获取 Python 脚本输出的最简单方法是什么?

    我有一个连续运行的 python 脚本 它每 30 秒输出 2 行信息 我希望能够在网络上查看此输出 特别是 我希望网站能够自动更新 每 30 秒在页面 网站顶部添加新输出 而无需刷新页面 我知道我可以用 javascript 做到这一点
  • GWT:在服务器代码中访问 i18n 消息

    我有一个扩展的接口com google gwt i18n client Messages类 我用它在 GWT 应用程序中检索 i18n 消息 它看起来像这样 public interface MyMessages extends com g
  • jQuery 触发 DatePicker 更改事件

    我有以下代码 custom datepicker selector datepicker weekStart 1 on changeDate function en var correct format correct format en
  • 未标记 AcceptVerbs、HttpGet 或 HttpPost 的控制器操作的默认行为是什么?

    如果我创建一个控制器操作并且不使用它来装饰它AcceptVerbs HttpPost or HttpGet 默认行为是什么 该操作是否允许任何访问方法或默认为GET 它可以通过任何动词访问
  • java中equals方法的实现

    这是我对 Coor 类的 equals 类的实现 它只包含 2 个整数 x 和 y 这是实现该方法的正确方法吗 public boolean equals Object obj if obj null obj getClass this g
  • Python3 Tkinter 字体不工作

    我将 python 3 3 与 tkinter 一起使用 并且安装了 python3 tk 包 在大多数文档中 使用旧的 import tkFont 它不再起作用 这应该有效 from tkinter import font appHigh
  • C++ 中的虚拟网络摄像头

    我想编写一个新的虚拟网络摄像头驱动程序 例如它将采用 AVI 或实时流作为屏幕并将其作为网络摄像头源进行流式传输 我真的不会有网络摄像头 我想添加一个可以传输桌面屏幕的虚拟网络摄像头 我应该在内核模式下编写一个网络摄像头来做到这一点 如果是
  • 遍历并修改dict结构的树状列表

    我有一个如下所示的结构 id 4 children None id 2 children id 1 children id 6 children None id 5 children None id 7 children id 3 chil