Могу ли я пропустить неопределенное количество шагов для замкнутого цикла? (Python)

1

Это, возможно, результат плохого дизайна, но здесь он идет. Я не был уверен, как объяснить эту проблему.

Итак, у меня есть код, который выполняет итерацию над списком слов. (Этот список не изменяется.) Затем код анализирует и объединяет некоторые слова вместе, в зависимости от набора критериев, сохраняя их в новом списке. Мастер-цикл, который принимает каждое слово по одному, затем должен был пропустить то, что было определено в коде. Так, например:

Список основных циклов слов:

ListA = [яблоко, банан, пингвин]

Внутри мастер-цикла, скажем, мой код решил, что яблоко и бананна принадлежат друг другу, поэтому

ListB = [яблочный банан, пингвин]

Теперь я хотел бы, чтобы Master Loop пропустил бананну, ему не нужно запускать чек, чтобы увидеть, есть ли банановые пары с чем-то другим. Поэтому я бы использовал оператор continue. Вот проблема. Я не знаю, сколько слов закончится спаренным. Таким образом, я мог бы в конечном итоге нуждаться в продолжении, или три продолжаются. Единственный способ, с помощью которого я могу работать, продолжать столько раз, сколько потребуется, - это использовать цикл... но это создает проблему, так как continue повлияет на цикл, в котором он находится.

Есть ли способ сделать так, чтобы мастер-цикл продолжался столько раз, сколько необходимо? Возможно, я пропустил что-то простое. Благодарим за помощь.

ИЗМЕНИТЬ

word_list = ["apple", "banana", "penguin"]    #word_list will be arbitrary in practice
phrase_length = 0    #phrase_length is the amount of times I would like to skip

for k, word in enumerate(word_list):
    #I would like to have the continues run here, before any of the below code        

    #the code down here decides what to pair in a forward fashion
    #so it starts from apple and looks ahead to see if something fits with it
    #continues in this manner till it comes up with the longest possible pairing
    #phrase_length is then set equal to the amount of words used make the pairing

Это потратило бы массу времени на вычисления, если бы ему пришлось выполнить код для банана, а также проверить вперед. Вот почему я хотел бы пропустить проверку банана.

  • 0
    Будут ли все слова из ListA так или иначе попадать в ListB?
  • 0
    опубликовать код, тогда мы можем помочь.
Показать ещё 3 комментария
Теги:
continue

3 ответа

0
Лучший ответ

Вы можете явно использовать метод next итератора.

>>> l = [1, 2, 3, 4, 5, 6]
>>> l_iter = iter(l)
>>> for n in l_iter:
      if n==2:
        print '{0}+{1}+{2}'.format(n, l_iter.next(), l_iter.next())
      else:
        print n
1
2+3+4
5
6

EDIT: да, это будет беспорядочно, когда в сочетании с перечислением. Другой вариант, который приходит на ум: напишите функцию как генератор, что-то вроде:

def combined_words(word_list):
  combined_word = ""
  for k, word in enumerate(word_list):
    combined_word += k
    if next_word_can_be_paired:
      pass
    else: # next word can't be paired
      yield combined_word
      combined_word = ""
  if combined_word:
    yield combined_word # just in case anything is left over

Затем вызовите list(combined_words(word_list)), чтобы получить новый список.

  • 0
    Из экспериментов, которые я только что выполнил с вашим предложенным методом, кажется, запутано перечисление, которое я забыл упомянуть, которое я использовал. Мне действительно понравилось ваше предложение, но я оставил вас работать с неполной информацией.
  • 0
    Я только что понял, что я идиот. Я только что понял, что мог бы установить итератор равным итератору, который перечисляет возвращаемые значения, и вызвать следующий. Спасибо за ваше предложение!
Показать ещё 1 комментарий
0

Я что-то пропустил?

word_list = ["apple", "banana", "penguin"]
skip_list = {}

for word in self.word_list:
    if word in skip_list:
        continue

    # Do word-pairing logic; if word paired, skip_list[word] = 1

Не может быть наиболее программно эффективным, но, по крайней мере, четким и кратким.

  • 0
    Я не уверен, что понимаю, почему вы используете это в качестве словаря. В частности, сопоставляя его со значением 1. Я думал о том, чтобы проверить, присутствует ли слово в списке каким-либо образом, просто надеялся на что-то более элегантное, я думаю. Спасибо за ваше предложение, я вполне могу использовать его.
  • 1
    Вы также можете использовать набор вместо dict.
0

вы можете попытаться использовать модуль itertools и espacially dropwhile.

  • 0
    Насколько я понимаю, это изменило бы данные в списке, на котором я его использую. Или, может быть, я действительно не понимаю, что это делает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню