Python 创建递归函数查找具有特定属性值的对象
我有一个基于以下内容的对象列表:Python 创建递归函数查找具有特定属性值的对象,python,Python,我有一个基于以下内容的对象列表: class foo: def __init__(self,name): self.name = name self.children = [] #other instances contained in this list 我创建了一个函数,当.name与搜索词匹配时,该函数将查找对象,并将搜索这些对象的所有子对象: def find(lst,search_term): for obj in lst:
class foo:
def __init__(self,name):
self.name = name
self.children = [] #other instances contained in this list
我创建了一个函数,当.name
与搜索词匹配时,该函数将查找对象,并将搜索这些对象的所有子对象:
def find(lst,search_term):
for obj in lst:
if obj.name == search_term:
return obj
elif obj.children != []:
try:
if find(obj.children,search_term).name == search_term:
return find(obj.children,search_term)
except AttributeError:
pass
有没有更优雅的方法可以做到这一点?您的“正常”基本情况很好。
您的“失败”基本情况应明确:
for obj in lst:
if obj.name == search_term:
return obj
else:
...
# If all searches failed
return None
您的递归步骤有多余的工作:(1)测试返回对象的名称,当您已经知道它匹配时;(2) 使用相同的数据重复出现两次。尝试简化逻辑:遍历obj
列表,直到找到匹配项
else:
if obj.children:
found_child = find(obj.children,search_term)
if found_child:
return found_child
这段代码取代了上面方框中的省略号。通常更容易将这些类型的问题划分为两个函数,一个用于在列表中查找,另一个用于在节点中查找。节点函数中的查找很简单(要么是正确的节点,要么尝试在子节点中查找): 然后,列表函数中的查找只调用每个项上的
\u find\u node
(如果找到了节点,则返回该节点):
请注意,
None
在未找到时显式返回。能否创建一个继承自Foo
类的FooChild
类?这样,您只需用一个for循环检查name
attr即可。@jeschwar,这将禁止孙子辈;-)
def _find_node(node, search_term):
if node.name == search_term:
return node
return _find_list(node.children, search_term)
def _find_list(lst, search_term):
for node in lst:
found = _find_node(node, search_term)
if found is not None:
return found
return None