[英]How to create tree structure from hierarchical data in Python?
使用类对结构进行编码:
class TreeNode:
def __init__(self, number, name):
self.number = number
self.name = name
self.children = []
def addChild(self, child):
self.children.append(child)
如何使用它的一个例子:
car = TreeNode(1111, "car")
engine = TreeNode(3333, "engine")
car.addChild(engine)
注意: number
属性不必是整数(例如,汽车为1111
); 它也可以是一个整数字符串(即"1111"
)。
要真正获得类似于您想要的输出的内容,我们需要将根对象序列化为嵌套字典:
class TreeNode:
def __init__(self, number, name):
self.number = number
self.name = name
self.children = []
def addChild(self, child):
self.children.append(child)
def serialize(self):
s = {}
for child in self.children:
s[child.name] = child.serialize()
return s
现在,我们可以使用json.dumps
获得类似于您想要的输出的json.dumps
:
dummy = TreeNode(None, None) # think of this as the root/table
car = TreeNode(1111, "car")
dummy.addChild(car)
engine = TreeNode(3333, "engine")
car.addChild(engine)
fan = TreeNode(4312, "fan")
engine.addChild(fan)
print(json.dumps(dummy.serialize(), indent=4))
印刷:
{
"car": {
"engine": {
"fan": {}
}
}
}
像这样的问题总是归结为算法和数据集。 我注意到你的数据集的第一件事是它的排序是这样的,没有孩子是前一个父母的父母。 换句话说,项目以“自上而下”的方式列出。 这总是正确的吗? 如果是,则意味着算法的逻辑变得简单得多。
另一个考虑因素是数据结构。 我会使用嵌套字典来保存这里的主要数据集。 每个新的唯一父项将是主字典的“键”。 与该键对应的每个“值”将是一个 dict,并且可以根据需要继续嵌套。 在这种情况下,只会有很少的嵌套级别。
因此,对于数据集中的每一行,您将检查 Parent 是否显示为顶部 dict 或任何嵌套 dict 中的键。 如果没有,您将在顶级字典中创建一个新条目,以 Parent 作为键,{Child:{}} 作为新条目的值。 (这将发生在“汽车”和“飞机”上。)
如果当前 Parent 确实在任何 dicts 中显示为键,则需要将 Child 值作为新键添加到 dict 中,该 dict 是 Parent 作为键的 dict 的值。 在这种情况下,Child 是新键,该键的值是空字典 {}。
以上是我用来编写代码的粗略逻辑。 我把那部分留给你。 您可能可以使用第三方库来减少工作量,但如果您正在上课并且这是一项作业,您的老师可能不希望您使用此类外部库。
请注意,上述逻辑假设数据集是按“自上而下”的方式组织的。 如果不是这种情况,那么逻辑会变得更加复杂,并且如果在数据集中处理该子级的新父级,则当前处于层次结构中某个级别的键可能会在层次结构中向下移动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.