创建递归函数以查找具有特定属性值的对象

时间:2019-05-31 21:26:40

标签: 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:
        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

是否有更优雅的方法?

2 个答案:

答案 0 :(得分:1)

您的“正常”基本情况很好。 您的“失败”基本情况应该明确:

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

此代码代替了上面代码块中的省略号。

答案 1 :(得分:0)

将这些类型的问题分为两种功能通常更容易,一种用于在列表中查找,另一种用于在节点中查找。在节点函数中的发现是微不足道的(它是正确的节点或尝试在子节点中寻找):

def _find_node(node, search_term):
    if node.name == search_term:
        return node
    return _find_list(node.children, search_term)

然后在列表函数中的发现仅在每个项目上调用_find_node(如果找到该节点,则返回该节点):

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

请注意,None在找不到时会显式返回。