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
有没有更优雅的方式来做到这一点?
解决方案
您的“正常”基本情况很好。您的“失败”基本情况应该是明确的:
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
这段代码代替了上面块中的省略号。
推荐阅读
- corda - 将 Corda 与自定义应用程序交互
- css - 使用'-webkit-appearance:none;' 阻止苹果弄乱 CSS
- visual-studio-code - VS Code,如何从 editor.formatOnSave 中排除目录
- r - R:应用与 do.call
- java - 使用来自特定用户的数据库中的数据填充表视图
- javascript - 当用户在 Angular 4 中刷新/重新加载页面时无法获得确认框
- flutter - 如何从 FadeInImage 小部件的 Flutter 中的图标制作图像提供程序?
- java - 使用在standalone.xml 或 domain.xml 中动态部署的war 文件的名称
- angularjs - 未捕获的错误:找不到模块“fs”
- android - Android 库 (jar/aar) 可以用于 Xamarin 中的 iOS