在 Python 中搜索任何树
Posted
技术标签:
【中文标题】在 Python 中搜索任何树【英文标题】:Searching any tree in Python 【发布时间】:2016-10-31 09:53:48 【问题描述】:我需要在 Python 中编写一个函数,该函数接受树和索引并返回该索引处的子树或叶。
我尝试了循环和嵌套循环,直到我意识到必须运行测试的树总是相同的:
tree = (((1, 2), 3), (4, (5, 6)), 7, (8, 9, 10))
实际上是这样的:
Sample tree
所以我需要通过给定的测试是这样的:
def tree_ref(tree, index):
if len(index) == 1:
print tree[index[0]]
elif len(index) == 2:
print tree[index[0]][index[1]]
elif len(index) == 3:
print tree[index[0]][index[1]][index[2]]
else:
return False
例如,对于索引 = (1, 1, 0),它应该返回数字 5,并且确实如此。
但是,我知道此代码不适用于具有超过 3 个元素的其他树或索引。我怎样才能使它适用于任何给定的树和索引?
【问题讨论】:
【参考方案1】:你应该尝试使用递归。
如下所示:
def tree_ref(tree, index):
if len(index) == 1:
print tree[index[0]]
else:
tree_ref(tree[index[0]], index[1:])
【讨论】:
非常感谢,完美运行。应该首先考虑递归,是的。 @DanielSarmiento:如果它解决了您的问题,请验证答案;)【参考方案2】:看看这个:How can I implement a tree in Python? Are there any built in data structures in Python like in Java?
您应该考虑将节点实现为链接文章中所述的类。如果您使用列表,您将很容易最终遇到您现在正在努力解决的问题。基于类的树不依赖于特定的形状或深度,并且更通用,更易于实现和搜索。
汉努
【讨论】:
【参考方案3】:在我看来itertree 包(我是作者)为这个问题提供了一个很好的解决方案。
首先我们构建一个表示给定元组结构的树:
>>>from itertree import *
>>>root=iTree('root')
>>># we must use some helper tags ("sub","sub2","sub3") to fill the tree
>>>root += iTree('sub')
>>>root += iTree('sub')
>>>root += iTree('sub',data=7)
>>>root += iTree('sub')
>>>root[0] += iTree('sub2')
>>>root[0][0] += iTree('sub3', data=1)
>>>root[0][0] += iTree('sub3', data=2)
>>>root[0] += iTree('sub2', data=3)
>>>
>>>root[1] += iTree('sub2', data=4)
>>>root[1] += iTree('sub2')
>>>root[1][0] += iTree('sub3', data=5)
>>>root[1][0] += iTree('sub3', data=6)
>>>
>>>root[3] += iTree('sub2', data=8)
>>>root[3] += iTree('sub2', data=9)
>>>root[3] += iTree('sub2', data=10)
树的内容如下所示:
>>>root.render()
iTree('root')
└──iTree('sub')
└──iTree('sub2')
└──iTree('sub3', data=1)
└──iTree('sub3', data=2)
└──iTree('sub2', data=3)
└──iTree('sub')
└──iTree('sub2', data=4)
└──iTree('sub3', data=5)
└──iTree('sub3', data=6)
└──iTree('sub2')
└──iTree('sub', data=7)
└──iTree('sub')
└──iTree('sub2', data=8)
└──iTree('sub2', data=9)
└──iTree('sub2', data=10)
现在可以通过索引访问项目:
>>>print(root[0][0][0].d_get())
1
>>># or
>>>print(root.get_deep([1, 0, 1]).d_get())
6
项目本身也知道他的索引路径:
>>>print(root.get_deep([0,0,1]).idx_path)
[0, 0, 1]
对数据内容的过滤访问也是可能的:
>>>item_filter=Filter.iTFilterData(data_value=iTInterval(2,5))
>>>for i in root.iter_all(item_filter):
>>> print(i)
iTree("'sub2'", data=3, subtree=[])
iTree("'sub2'", data=4, subtree=[iTree("'sub3'", data=5, subtree=[]), iTree("'sub3'", data=6, subtree=[])])
【讨论】:
以上是关于在 Python 中搜索任何树的主要内容,如果未能解决你的问题,请参考以下文章