【问题标题】:build a tree using two columns and count the level使用两列构建树并计算级别
【发布时间】:2019-10-05 18:07:48
【问题描述】:

我有一个与这个问题有些相似的问题,因此我使用了相同的示例:https://stackoverflow.com/questions/46722740/hierarchical-data-efficiently-build-a-list-of-every-descendant-for-each-node#=

我有一个两列数据集,描述了形成一棵大树的公司的多个子父关系。我想用它来计算树的高度。

原始输入:

   child  parent
8   1000    1000
1   2010    1000
7   2100    1000
5   2110    1000
3   3000    2110
2   3011    2010
4   3033    2100
0   3102    2010
6   3111    2110

我想做的是得到这棵树的高度。在这种特定情况下,高度将是三。

我不确定如何在 Python 或 PySpark 中执行此操作。我不知道这是否可能。我的思维模式是首先使用一些包 f.e. 构建一棵树。然后计算高度。但是,我根本不知道如何在 Python/PySpark 中执行此操作。我是用编程语言创建树的初学者,虽然我可以手工绘制,但对使用编程构建自己的树知之甚少。

【问题讨论】:

  • 您可以使用字典和/或列表自己构建树,也可以使用 networkx 等库。如果您要自己构建它,我建议您离开计算机并手动完成您的示例。您将如何根据您的示例子/父数据在一张纸上构建一棵树?
  • 我无法导入图像。但是,如果您单击我问题中的链接,则原始帖子已经添加了图像。我确实了解树是如何构建的,但我不知道如何使用 Python 创建树。我想我在我的主要帖子中不清楚这一点,我已经编辑了我的主要帖子。
  • 我用我的手机发送这条评论。我最终会在明天回答你的问题。这个想法是声明一个 Node 类,它可能有一个子列表,甚至没有。如果它没有孩子的列表,它就是一片叶子。这是'3000'、'3011'、'3033'、'3102'的情况和 '3111'在你的例子中。要获得节点的高度,您需要考虑其所有子节点的 max(height) +1。如果它是一片叶子,它的高度当然是 1。
  • @Meziane 如果您能给我一个关于如何执行此操作的代码,我将不胜感激。

标签: python dataframe recursion tree networkx


【解决方案1】:

在寻求帮助并提供您使用过的代码之前,您必须尝试解决您的问题。无论如何,这就是您所需要的:

class Node:
  def __init__(self, name, desc):
    self.name = name
    self.desc = desc


  def height(self):
    if len(self.desc)==0:
      return 1
    else:
      return 1 + max(len(child.desc) for child in n1000.desc)


n3000 =Node("3000", []);
n3011 =Node("3011", []);
n3033 =Node("3033", []);
n3102 =Node("3102", []);
n3111 =Node("3111", []);




n2010 = Node("2010", [n3011, n3102]);
n2100 = Node("2100",[n3033]);
n2110 = Node("2110", [n3000, n3111]);

n1000 = Node("1000", [n2010, n2100, n2110]);

#print(max(len(child.desc) for child in n1000.desc))

print(n1000.name, n2010.height())

【讨论】:

  • 谢谢。我已经使用 treelib 库来构建我的树。我想我会更新我的问题以包含我自己的解决方案。我认为您的解决方案可能更好(我使用了一个包,而您实际上自己定义了一个函数)。
  • @Eren: 一句甜言蜜语永远都不晚:不客气
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多