【问题标题】:Breadth First Search traversal for LXML Files PythonLXML文件Python的广度优先搜索遍历
【发布时间】:2021-09-30 05:08:39
【问题描述】:

我正在对 XML 文件执行广度优先搜索 (BFS) 遍历。 https://lxml.de/3.3/api.html#lxml-etre 中显示了深度优先搜索算法。但是,我需要帮助来应用基于此代码的 BFS 搜索。 以下是文档中给出的代码:

>>> root = etree.XML('<root><a><b/><c/></a><d><e/></d></root>')
>>> print(etree.tostring(root, pretty_print=True, encoding='unicode'))
<root>
  <a>
    <b/>
    <c/>
  </a>
  <d>
    <e/>
  </d>
</root>

>>> queue = deque([root])
>>> while queue:
...    el = queue.popleft()  # pop next element
...    queue.extend(el)      # append its children
...    print(el.tag)

根 一种 d b C e

我需要帮助来尝试附加它以使其适合 BFS 遍历。下面是我尝试编写的代码示例,但它无法正常工作。有人可以帮忙吗。 我的代码: 从集合导入双端队列

>>> d = deque([root])
>>> while d:
    >>> el = d.pop() 
    >>> d.extend(el)
    >>> print(el.tag)

谢谢

【问题讨论】:

    标签: python xml xml-parsing lxml breadth-first-search


    【解决方案1】:

    也可以用xpath实现

    >>> root = etree.XML('<root><a><b/><c><f/></c></a><d><e/></d></root>')
    >>> queue = deque([root])
    >>> while queue:
    ...     el = queue.popleft()
    ...     queue.extend(el.xpath('./child::*'))
    ...     print(el.tag)
    ... 
    root
    a
    d
    b
    c
    e
    f
    

    【讨论】:

      【解决方案2】:

      您的 BFS 实现当前从队列的错误一端弹出。你应该使用 popleft() 而不是 pop()。

      d = deque([root])
      while d:
          el = d.popleft() 
          d.extend(el)
          print(el.tag)
      

      【讨论】:

      • 您好,感谢您的回复。但我相信您编写的代码是深度优先的(lxml 网站上已经提供)。我需要广度优先搜索。你能帮忙吗?
      • 这会按照广度优先搜索的顺序打印树。也许你误解了 BFS? @Upatel2
      • @Upatel2 考虑添加您的预期输出与您得到的输出。
      • 谢谢。是的,我可能有点困惑自己。感谢您的回复。
      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多