在python中遍历树层次结构?
我是新来的,对python很陌生 我们有一个家庭作业,我已经可以做剩下的了,但还有一个问题: 如果我有这样的树层次结构:在python中遍历树层次结构?,python,recursion,tree,Python,Recursion,Tree,我是新来的,对python很陌生 我们有一个家庭作业,我已经可以做剩下的了,但还有一个问题: 如果我有这样的树层次结构: root = [ parent1 = [ child1, child2 = [ sub_child ] child3 ], parent2 = [ child1, child2 ] ] 它们都是一个名为TreeHierarc
root = [
parent1 = [
child1,
child2 = [
sub_child
]
child3
],
parent2 = [
child1,
child2
]
]
它们都是一个名为TreeHierarchyClass
的类的实例,它们都有一个name属性,我怎么才能找到我输入了name的类呢
我尝试使用for循环,但无法知道我需要多少?获取名称很容易:
name = input("Enter name: ")
if name == TreeHierarchyObject.name:
print("Found it!")
但是如何循环对象呢?这里应该使用简单的递归。 该方法稍微取决于子对象附着到父对象的方式 如果他们在一个列表中,我建议这样做,那么这一个就可以了。 只需在类中定义以下方法:
def findObjectByName(self, name):
if self.name == name:
return self
else:
for child in self.children:
match = child.findObjectByName(name)
if match:
return match
编辑:
要使此操作适用于任何属性,而不仅仅是名称,请改用getattr()
:
def findObject(self, attr, value):
if getattr(self, attr) == value:
return self
else:
for child in self.children:
match = child.findObject(attr, value)
if match:
return match
只需调用
root.findObject(“Sub-Child!”)
或使用第二种方法:root.findObject(“name”,“Sub-Child!”)
您应该在这里使用简单的递归。
该方法稍微取决于子对象附着到父对象的方式
如果他们在一个列表中,我建议这样做,那么这一个就可以了。
只需在类中定义以下方法:
def findObjectByName(self, name):
if self.name == name:
return self
else:
for child in self.children:
match = child.findObjectByName(name)
if match:
return match
编辑:
要使此操作适用于任何属性,而不仅仅是名称,请改用getattr()
:
def findObject(self, attr, value):
if getattr(self, attr) == value:
return self
else:
for child in self.children:
match = child.findObject(attr, value)
if match:
return match
只需调用
root.findObjectByName(“Sub-Child!”)
或使用第二种方法:root.findObject(“name”,“Sub-Child!”)
您可以使用递归
或使用迭代
。无论哪种方式都无关紧要。但是你需要一个搜索树的策略
下面是一些浏览图表的策略:
着色
:
visitor
模式,并向TreeHierarchyClass
添加一个方法.visit()
,以访问其子节点,另一个方法按名称查找节点
# imagine we got this class
class TreeHierarchyClass(object):
def __init__(self, value):
self.children = []
self.value = value
if self.value == 13:
self.name = 'the lucky one.'
def add(self, value):
self.children.append(type(self)(value))
您可以通过以下方式访问所有节点:
def visit(tree):
visited = set()
nonvisited = set()
nonvisited.update(tree.children)
while nonvisited:
item = nonvisited.pop()
# already seen
if item in visited:
continue
# mark item
visited.add(item)
yield item
# add children
nonvisited.update(item.children)
让我们构建一个示例树结构:
root = TreeHierarchyClass(0)
for i in range(10):
root.add(i)
for i in range(10):
root.children[1].add(i + 10)
现在,让我们查找一些项目:
def find(name):
for item in visit(root):
print 'checking item with value %d' % item.value,
if getattr(item, 'name', None) == name:
print '- found it.'
break
else:
print '- nope, keep searching.'
else:
print 'Sorry, not found.'
find('the lucky one.')
find('the lost one.')
此示例将打印:
>>> find('the lucky one.')
checking item with value 7 - nope, keep searching.
checking item with value 0 - nope, keep searching.
checking item with value 1 - nope, keep searching.
checking item with value 12 - nope, keep searching.
checking item with value 2 - nope, keep searching.
checking item with value 9 - nope, keep searching.
checking item with value 19 - nope, keep searching.
checking item with value 3 - nope, keep searching.
checking item with value 11 - nope, keep searching.
checking item with value 4 - nope, keep searching.
checking item with value 14 - nope, keep searching.
checking item with value 5 - nope, keep searching.
checking item with value 6 - nope, keep searching.
checking item with value 15 - nope, keep searching.
checking item with value 8 - nope, keep searching.
checking item with value 16 - nope, keep searching.
checking item with value 13 - found it.
>>> find('the lost one.')
checking item with value 7 - nope, keep searching.
checking item with value 0 - nope, keep searching.
checking item with value 1 - nope, keep searching.
checking item with value 12 - nope, keep searching.
checking item with value 2 - nope, keep searching.
checking item with value 9 - nope, keep searching.
checking item with value 19 - nope, keep searching.
checking item with value 3 - nope, keep searching.
checking item with value 11 - nope, keep searching.
checking item with value 4 - nope, keep searching.
checking item with value 14 - nope, keep searching.
checking item with value 5 - nope, keep searching.
checking item with value 6 - nope, keep searching.
checking item with value 15 - nope, keep searching.
checking item with value 8 - nope, keep searching.
checking item with value 16 - nope, keep searching.
checking item with value 13 - nope, keep searching.
checking item with value 17 - nope, keep searching.
checking item with value 10 - nope, keep searching.
checking item with value 18 - nope, keep searching.
Sorry, not found.
您可以使用
递归
,也可以使用迭代
。无论哪种方式都无关紧要。但是你需要一个搜索树的策略
下面是一些浏览图表的策略:
着色
:
visitor
模式,并向TreeHierarchyClass
添加一个方法.visit()
,以访问其子节点,另一个方法按名称查找节点
# imagine we got this class
class TreeHierarchyClass(object):
def __init__(self, value):
self.children = []
self.value = value
if self.value == 13:
self.name = 'the lucky one.'
def add(self, value):
self.children.append(type(self)(value))
您可以通过以下方式访问所有节点:
def visit(tree):
visited = set()
nonvisited = set()
nonvisited.update(tree.children)
while nonvisited:
item = nonvisited.pop()
# already seen
if item in visited:
continue
# mark item
visited.add(item)
yield item
# add children
nonvisited.update(item.children)
让我们构建一个示例树结构:
root = TreeHierarchyClass(0)
for i in range(10):
root.add(i)
for i in range(10):
root.children[1].add(i + 10)
现在,让我们查找一些项目:
def find(name):
for item in visit(root):
print 'checking item with value %d' % item.value,
if getattr(item, 'name', None) == name:
print '- found it.'
break
else:
print '- nope, keep searching.'
else:
print 'Sorry, not found.'
find('the lucky one.')
find('the lost one.')
此示例将打印:
>>> find('the lucky one.')
checking item with value 7 - nope, keep searching.
checking item with value 0 - nope, keep searching.
checking item with value 1 - nope, keep searching.
checking item with value 12 - nope, keep searching.
checking item with value 2 - nope, keep searching.
checking item with value 9 - nope, keep searching.
checking item with value 19 - nope, keep searching.
checking item with value 3 - nope, keep searching.
checking item with value 11 - nope, keep searching.
checking item with value 4 - nope, keep searching.
checking item with value 14 - nope, keep searching.
checking item with value 5 - nope, keep searching.
checking item with value 6 - nope, keep searching.
checking item with value 15 - nope, keep searching.
checking item with value 8 - nope, keep searching.
checking item with value 16 - nope, keep searching.
checking item with value 13 - found it.
>>> find('the lost one.')
checking item with value 7 - nope, keep searching.
checking item with value 0 - nope, keep searching.
checking item with value 1 - nope, keep searching.
checking item with value 12 - nope, keep searching.
checking item with value 2 - nope, keep searching.
checking item with value 9 - nope, keep searching.
checking item with value 19 - nope, keep searching.
checking item with value 3 - nope, keep searching.
checking item with value 11 - nope, keep searching.
checking item with value 4 - nope, keep searching.
checking item with value 14 - nope, keep searching.
checking item with value 5 - nope, keep searching.
checking item with value 6 - nope, keep searching.
checking item with value 15 - nope, keep searching.
checking item with value 8 - nope, keep searching.
checking item with value 16 - nope, keep searching.
checking item with value 13 - nope, keep searching.
checking item with value 17 - nope, keep searching.
checking item with value 10 - nope, keep searching.
checking item with value 18 - nope, keep searching.
Sorry, not found.
根目录是什么类型的对象<代码>列表<代码>指令?我不知道有什么Python语法可以像您当前的示例中那样支持子声明,如
root=[parent=[…
。什么类型的对象是root
?list
?dict
?我不知道有什么Python语法可以支持子声明,如root=[parent=[…
正如您当前在示例中所做的那样。谢谢您,我使用child
而不是children
,但我认为孩子更好,请更改它!谢谢您,我使用child
而不是children
但我认为孩子更好,请更改它!