def getCategoriesAsList(element):
try:
print "I am {0}".format(element.getNodeID())
if element.hasChilds():
for value in element.getChildren().values():
print "{0} added to list".format(value.getNodeID())
return [value]+getCategoriesAsList(value)
else:
print "{0} added to list".format(element.getNodeID())
return [element]
except Exception as err:
print err
早上好!
我试图在python中迭代我的树,我想将树转换为具有一些转换的元素列表。
问题是当元素不是子元素时,函数不执行递归调用。我做了一些调试信息,但我无法理解这种行为!
答案 0 :(得分:0)
当您在for
循环中返回时,它将无法继续。请考虑使用yield
关键字而不是return
。
for value in element.getChildren().values():
print "{0} added to list".format(value.getNodeID
yield [value]+getCategoriesAsList(value)
<强>解释强>
当它从for循环返回时,它会停止对该函数的调用并返回变量value
。
yield
关键字完全相同,但在当前函数调用中继续执行,因此它将遍历所有for循环。
答案 1 :(得分:0)
这是一个保留函数符号的更新版本:
def getCategoriesAsList(element):
try:
print "I am {0}".format(element.getNodeID())
result = []
if element.hasChilds():
for value in element.getChildren().values():
print "{0} added to list".format(value.getNodeID())
result.append(value)
result.extend(getCategoriesAsList(value))
else:
print "{0} added to list".format(element.getNodeID())
result.append(element)
return result
except Exception as err:
print err
另一种选择是使用yield
。它为您提供以下解决方案:
def getCategoriesAsList(element):
try:
print "I am {0}".format(element.getNodeID())
if element.hasChilds():
for value in element.getChildren().values():
print "{0} added to list".format(value.getNodeID())
yield value
for v in getCategoriesAsList(value):
yield v
else:
print "{0} added to list".format(element.getNodeID())
yield element
except Exception as err:
print err
只需按以下方式调用该函数:
print list(getCategoriesAsList(root))
答案 2 :(得分:0)
假设您想要一个包含所有xml Element
对象的最终列表,您可以使用不同的方法:
def getCategoriesAsList(element):
i = element.iter()
return [next(i) for _ in i]