我有一个基于以下内容的对象列表:
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
是否有更优雅的方法?
答案 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
在找不到时会显式返回。