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