5

我正在使用 etree 遍历一个 xml 文件。

import xml.etree.ElementTree as etree
tree = etree.parse('x.xml')
root = tree.getroot()
for child in root[0]:
 for child in child.getchildren():
        for child in child.getchildren():
            for child in child.getchildren():
               print(child.attrib)

python中避免这些嵌套for循环的惯用方式是什么。

  getchildren() ⇒ list of Element instances [#]
    Returns all subelements. The elements are returned in document order.

Returns:
A list of subelements.

我在 SO 中看到了一些帖子,例如 避免嵌套 for 循环 ,但没有直接转化为我的使用。

谢谢。

4

2 回答 2

3

如果您想获取n树中级别较深的孩子,然后遍历它们,您可以执行以下操作:

def childrenAtLevel(tree, n):
    if n == 1:
        for child in tree.getchildren():
            yield child
    else:
        for child in tree.getchildren():
            for e in childrenAtLevel(child, n-1):
                yield e

然后,要获得四个层次的元素,您只需说:

for e in childrenAtLevel(root, 4):
     # do something with e

或者,如果您想获取所有叶节点(即本身没有任何子节点的节点),您可以执行以下操作:

def getLeafNodes(tree):
    if len(tree) == 0:
         yield tree
    else:
         for child in tree.getchildren():
            for leaf in getLeafNodes(child):
                yield leaf
于 2013-02-08T20:25:23.723 回答
2

itertools.chain.from_iterable将压平一层嵌套;您可以使用functools.reduce它来应用它n次(压缩“n”次对象成员调用):

from itertools import chain
from functools import reduce

for child in reduce(lambda x, _: chain.from_iterable(x), range(3), root):
    print(child.attrib)

请注意,getchildren已弃用;迭代一个节点直接产生它的子节点。

于 2013-02-08T20:40:01.947 回答