【问题标题】:Creating a tree from a list of tuples从元组列表创建树
【发布时间】:2010-10-21 11:00:15
【问题描述】:

我现在好像失明了,所以我需要在这里问一下。我想对一个看起来像这样的元组列表进行排序

(id, parent_id, value)

因此它将树表示为树节点列表的扁平列表。

例如输入

(1, None, '...')
(3, 2', '...')
(2, 1, '...')
(4, 1, '...')
(5, 2, '...')
(6, None, '...')

之后应该这样排序

(1, None, '...')
(2, 1, '...')
(3, 2', '...')
(5, 2, '...')
(4, 1, '...')
(6, None, '...')

任何提示将不胜感激。提前致谢。

【问题讨论】:

  • 什么样的树?你都尝试了些什么? ...为什么不直接使用当前的实现?
  • 那是什么类型的?它是一棵具有多个根节点的不平衡树?我很困惑。
  • 基本上,我是从数据库中获取的。什么样的树不能被终止,因为它是更好的平衡或类似的东西。它更像是一个文件系统树。您所说的当前实现是什么意思?
  • 这是一个父子关系列表,我想将其显示在树或网页上的类似内容中。

标签: python sorting tree


【解决方案1】:

Python 从左到右对元组进行排序,因此如果您将元组排列为第一个排序键是第一项,依此类推,它会相当有效。

根据您的描述,从元组列表到树的映射并不清楚。请把它画出来,或者更彻底地解释一下。例如,您的示例似乎是:


(来源:sabi.net

如果您有两个没有父节点的节点,那更像是森林而不是树。你想用树代表什么?在这种情况下,“排序”是什么意思?

【讨论】:

  • 是的,本质上它是一片树林。列表中的每个元组都是一个项目,可以有另一个元组作为其父项。您的图片对其进行了正确建模。它类似于我想要创建的文件系统视图。
  • 好的,那么你想如何对森林进行排序?看起来您或多或少地进行了前序遍历,然后按 ID 对根进行排序?如果是这样,我建议您考虑使用另一种使它们更易于排序的表示,例如其键是节点 ID 的嵌套字典。然后,如果需要,您可以将字典展平到元组表示列表中。
【解决方案2】:

我不确定我是否完全遵循了您正在尝试做的事情,但是如果您有一个森林作为节点列表,您不能只阅读它并构建树结构,然后将其写出来作为所有树的面包优先遍历?有什么特别的理由可以避免这种情况吗?

【讨论】:

  • 不,我想,我将不得不采取这种方法。我唯一想跳过的是可能的情况,我有一个包含 10.000 个元组(也称为数据库行)的列表,我将其放入字典基础森林中,并从中再次创建一个元组列表。
【解决方案3】:

奥利弗,如果我理解正确的话,我想你也可以 (a) 将数据库中的所有元组检索到字典或列表中,然后构造树, 要么 (b) 在检索元组时使用 ORDER BY 子句,以便它们按照将它们添加到树中的顺序排列。

如果可以在您的应用程序中对树进行更改然后传播到数据库,我会选择一个,但如果更改总是在数据库插入、更新或删除时进行,并且除这些之外,您的树是读取-只有,那么选项 b 应该更快并且需要更少的资源。

罗兰

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多