Python深深地遍历数组。树

时间:2018-11-29 13:45:46

标签: python loops

需要有关循环的建议。

我有一个元素数组。

我需要遍历数组并检查每个元素的正则表达式。如果元素与正则表达式匹配,我将调用一个函数,该函数将返回新的元素数组。然后,在继续迭代之前,我应该遍历这组新元素,并执行相同的过程。这就像在树中进行深度优先搜索。

似乎我需要使用“ while”循环,但是我无法弄清楚逻辑。

例如:

def get_elements(element):
   #some code
   return elements

def loop_through_elements(elements):
    for element in elements:
       if re.search("myRegExp", element):
          elements = get_elements(element);
       else:
          return element

3 个答案:

答案 0 :(得分:0)

如果我们假设每个元素都是字符串或可交互的类型(例如列表),则可以使用递归来解决此问题:

def examine_element(element):
    """ Examine a single element
    """
    if re.search("myREgExp", element):
        pass # TODO

def examine_each_element(elements):
    """ Examine all elements recursively
    """
    for element in elements:
        if isinstance(str, element):
            # This element is a single element
            examine_element(element)
        else:
            # This element represents multiple elements
            examine_each_element(elements)

请注意,此方法有一些限制,请注意:

  1. 如果您的结构不是DAG(有向无环图),则它将永远循环。由于您提到的是一棵树,所以应该没事。
  2. 如果树太大,则这将失败,因为您将耗尽堆栈空间。在这种情况下,您应该尝试使用迭代方法。

答案 1 :(得分:0)

您可以尝试使用递归函数,并在其定义内调用“ loop_through_elements(elements)”。

def loop_through_elements(elements):
    for element in elements:
        if re.search("myRegExp", element):
            loop_through_elements(get_elements(element))
        else:
            return element

答案 2 :(得分:0)

如果要对元素进行深度优先迭代,可以考虑如下逻辑:

def loop_through_elements(elements):
    for element in elements:
       if re.search("myRegExp", element):
          child_elements = get_elements(element)
          return loop_through_elements(child_elements)
       else:
          return element

以下三点与您的代码不同:

  1. 您要确保您不会覆盖“元素” 获得新元素时会发生变化。相反,我称这些 “ child_elements”。

  2. 我在loop_through_elements函数中添加了对loop_through_elements的调用。这称为recursion!如果您不熟悉此概念,建议您多读一些,因为此示例可能不是学习递归的绝佳场所。

  3. 我添加了另一个return语句,但是,您应该考虑一下此函数现在的功能以及它是否适合您的要求。当您在树的“更深”级别中找到与正则表达式不匹配的元素时,会发生什么?如果一切都与正则表达式匹配,您是否保证检查整棵树?如果您完成了for循环而没有深入到树上,您是否应该有一些特殊条件?