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

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

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

Список слов мастер цикла:

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

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

Ответы [ 3 ]

0 голосов
/ 05 августа 2010

Я что-то упускаю?

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 голосов
/ 05 августа 2010

Вы можете явным образом использовать метод итератора 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

РЕДАКТИРОВАТЬ: да, это может привести к путанице в сочетании с перечислением.Еще один вариант, который приходит на ум: написать функцию как генератор, что-то вроде:

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 голосов
/ 05 августа 2010

вы можете попытаться использовать модуль itertools и, в особенности, функцию , а .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...