使用 python 将分隔字符串列表转换为树/嵌套字典

2023-11-27

我正在尝试转换点分隔字符串的列表,例如

['one.two.three.four', 'one.six.seven.eight', 'five.nine.ten', 'twelve.zero']

进入一棵树(嵌套列表或字典 - 任何易于遍历的东西)。 真实数据恰好有1到4个不同长度的点分隔部分,总共有2200条记录。 我的实际目标是用这些数据填充 4 个 QComboBox 的集合,第一个 QComboBox 填充第一组项目 [“一”、“五”、“十二”](无重复)。然后,根据所选项目,第二个 QComboBox 会填充其相关项目:对于“一”,它将是:[“二”、“六”],依此类推(如果存在另一个嵌套级别)。

到目前为止,我已经有了一个工作列表 -> 嵌套字典解决方案,但它非常慢,因为我使用常规 dict()。我似乎很难将其重新设计为默认字典,以便轻松地正确填充组合框。

我当前的代码:

def list2tree(m):
    tmp = {}
    for i in range(len(m)):
        if m.count('.') == 0:
            return m
        a = m.split('.', 1)
        try:
            tmp[a[0]].append(list2tree(a[1]))
        except (KeyError, AttributeError):
            tmp[a[0]] = list2tree(a[1])
    return tmp

main_dict = {}
i = 0
for m in methods:
    main_dict = list2tree(m)
    i += 1
    if (i % 100) == 0: print i, len(methods)
print main_dict, i, len(methods)

ls = ['one.two.three.four', 'one.six.seven.eight', 'five.nine.ten', 'twelve.zero']
tree = {}

for item in ls:
    t = tree
    for part in item.split('.'):
        t = t.setdefault(part, {})

Result:

{
 "twelve": {
  "zero": {}
 }, 
 "five": {
  "nine": {
   "ten": {}
  }
 }, 
 "one": {
  "six": {
   "seven": {
    "eight": {}
   }
  }, 
  "two": {
   "three": {
    "four": {}
   }
  }
 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 python 将分隔字符串列表转换为树/嵌套字典 的相关文章

随机推荐

  • 如何在实体框架代码优先中删除表?

    我正在使用具有自动迁移功能的实体框架 因此 当我向上下文添加新模型时 我的数据库会更新并创建新表 我想做的恰恰相反 将表从数据库中完全删除 但是 从 Context 类中删除定义不起作用 public class CompanyContex
  • Xcode:使用核心图像与 alpha 进行合成

    我想创建一个 CoreImage 滤镜链 并能够通过将其单独效果与 alpha 或不透明度设置合成来控制链中每个滤镜的 强度 但我没有看到与 alpha 合成的方法或文档中的不透明度 我猜我可以跳出核心图像过滤器链并与核心图形上下文进行合成
  • 将 JavaScript 变量值传递给输入类型隐藏值

    我想将两个整数的乘积值分配给 html 文档中已有的隐藏字段 我正在考虑获取 javascript 变量的值 然后将其传递给隐藏的输入类型 我很难解释 但这就是它应该如何工作 脚本示例 上面计算了产品 我希望产品位于隐藏字段中
  • 如何使用 Spring-Kafka 通过 Confluence Schema 注册表读取 AVRO 消息?

    如何使用 Spring Kafka 通过 Confluence Schema 注册表读取 AVRO 消息 有样品吗 我在官方参考文档中找不到它 下面的代码可以读取 customer avro 主题的消息 这是我定义的值的 AVRO 模式 t
  • 迭代未注册的加载项 (.xla)

    我需要帮助 了解如何迭代当前打开的 Excel 加载项文件 xla 尚未使用 Excel 注册Tools gt Add ins菜单路径 更具体地说 我对未出现在加载项对话框中但具有的任何工作簿感兴趣ThisWorkbook IsAddin
  • 如何在没有 matlabs 数据库工具箱的情况下从 matlab 访问 postgresql 数据库?

    我已经尝试使用pgmex 不幸的是它不能与 libpq5 一起工作 matlab 立即崩溃 要在不使用数据库工具箱的情况下从 matlab 连接到 postgres 请执行类似以下操作 Add jar file to classpath e
  • 未使用的方法和属性对库或可执行文件的影响

    我正在尝试为 C NET 创建源代码生成器 生成永远不会被调用的属性或方法会导致我的代码运行速度变慢吗 为不使用的库插入 using 语句怎么样 我假设编译器足够聪明 不会构建未使用的 using 语句 但它无法了解属性和方法 因为它们co
  • 使用 Telethon 发送 Telegram 消息:某些实体参数有效,其他参数无效?

    我正在使用 Telethon 的发信息功能向各种聊天发送消息 有时 目的地是另一个用户 只是常规的一对一聊天 有时是一个组 有时是一个超级组 有时是一个频道 我是其中的管理员 如果我理解正确的话 语法应该是 client send mess
  • 为什么PHP不支持多线程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我到处都读到 PHP 不支
  • 如何使用Python有效地将解析后的XML文档存储在MySQL数据库中?

    以下是 XML 文件 book xml
  • TFS 2013:同一台机器上的多个构建控制器

    我希望我们可以在同一台机器上使用多个构建控制器 因为我们有许多团队项目集合 但它们不会同时使用 因此这里不存在真正的性能问题 并且我们的大多数构建服务器都不会长时间使用 我知道可以使用 TFS 2010 和 TFS 2012 来做到这一点
  • 提升asio超时[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 boost asio 中设置阻塞套接字的超时 我之前读过一些关于超时的条目 但我不明白 我想要一个定义的连接超时 连接代码如下所示 try boost asio ip tcp resolver
  • 如何将复选框作为 dataGridView 的 ColumnHeader

    我正在 C VS2005 中开发一个窗口应用程序 我有一个 dataGridView 其中第一列有复选框 现在我希望列标题也成为一个复选框 如果我选择列中的所有复选框 则应选择该复选框 我怎样才能做到这一点 我提到了代码项目链接 但如果我使
  • 如何获得以赫兹为单位的 DFT/FFT 输出频率?

    我想开发音符检测器作为我的学位项目 并且我想从头开始 我已经为 wav 文件编写了代码 该文件从该音频音乐文件中提取所有信息并给出振幅 然后我编写了 DFT 代码 它以复数形式输出 其中轴 实数 虚数 之一是幅度 幅度 另一个轴是相位 现在
  • 使用 xmlSerializer.Serialize 和 IEnumerable 对象序列化对象

    我有一个对象 其中包含一个定义为 IEnumerable 的对象 即 Serializable XmlRoot MyObject public class MyObject XmlAttribute public string Name g
  • Jackson:如何在不修改 POJO 的情况下向 JSON 添加自定义属性

    我正在为我的应用程序开发一个 REST 接口 使用 Jackson 将我的 POJO 域对象序列化为 JSON 表示形式 我想自定义某些类型的序列化 以向 POJO 中不存在的 JSON 表示添加其他属性 例如添加一些元数据 参考数据等 我
  • 如何防止 Google Colab 断开连接?

    有没有办法以编程方式阻止谷歌合作实验室超时断开连接 以下描述了笔记本电脑自动断开连接的情况 Google Colab 笔记本的空闲超时为 90 分钟 绝对超时为 12 小时 这意味着 如果用户超过 90 分钟没有与其 Google Cola
  • 为什么 x86_64 CPU 上没有通用寄存器的乘加融合?

    在 Intel 和 AMD x86 64 处理器上 SIMD 矢量化寄存器具有特定的融合乘加功能 但通用 标量 整数 寄存器don t 你基本上需要先乘法 然后加法 除非你可以将东西放入一个lea 这是为什么 我的意思是 它是否毫无用处以至
  • iOS 9 Facebook SDK 登录/分享

    我在 iOS 9 上使用最新的 Facebook SDK 4 6 时遇到了问题 为了授权用户 我使用 FBSDKLoginManager 我尝试过这样设置 loginManager loginBehavior FBSDKLoginBehav
  • 使用 python 将分隔字符串列表转换为树/嵌套字典

    我正在尝试转换点分隔字符串的列表 例如 one two three four one six seven eight five nine ten twelve zero 进入一棵树 嵌套列表或字典 任何易于遍历的东西 真实数据恰好有1到4个