Python цикл через массив глубоко.дерево - PullRequest
0 голосов
/ 29 ноября 2018

Нужен совет относительно зацикливания.

У меня есть массив элементов.

Мне нужно перебрать массив и проверить каждый элемент на наличие регулярных выражений.Если элемент соответствует регулярному выражению, я вызываю функцию, которая возвращает новый массив элементов.Затем я должен перебрать этот массив новых элементов, выполняя ту же процедуру, прежде чем продолжить итерацию.Это похоже на поиск по глубине в дереве.

Кажется, мне нужно использовать цикл 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 голосов
/ 29 ноября 2018

Вы можете попробовать использовать рекурсивную функцию и вызвать "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
0 голосов
/ 30 ноября 2018

Если вы хотите выполнить итерацию в глубину по своим элементам, вы можете подумать о логике следующим образом:

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

Есть 3 вещи, которые отличаются от вашего кода:

  1. Вы хотите убедиться, что вы не перезаписываете свою переменную "elements", когда получаете новые элементы.Вместо этого я вызываю эти child_elements.

  2. Я добавил вызов loop_through_elements внутри функции loop_through_elements.Это называется рекурсия !Если эта концепция для вас нова, я предлагаю прочитать немного больше об этом, так как этот пример может быть не совсем ясным местом для изучения рекурсии.

  3. Я добавил еще одно выражение возврата но вам следует подумать о том, что эта функция делает сейчас и соответствует ли она тому, что вы хотите, чтобы она делала.Что происходит, когда вы находите элемент, который не соответствует регулярному выражению, на «более глубоком» уровне дерева?Вы гарантированно проверите все дерево, если все соответствует регулярному выражению?Должны ли у вас быть какие-то особые условия, если вы закончите цикл for, не углубляясь в дерево?
0 голосов
/ 29 ноября 2018

Если мы предположим, что каждый элемент является либо строковым, либо целочисленным типом (например, списком), мы можем решить эту проблему с помощью рекурсии:

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. Если ваше дерево слишком большое, это не удастся, потому что у вас не хватит места в стеке.В этом случае вам следует попробовать итеративный подход.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...