Это, возможно, результат плохого дизайна, но здесь он идет. Я не был уверен, как объяснить эту проблему.
Итак, у меня есть код, который выполняет итерацию над списком слов. (Этот список не изменяется.) Затем код анализирует и объединяет некоторые слова вместе, в зависимости от набора критериев, сохраняя их в новом списке. Мастер-цикл, который принимает каждое слово по одному, затем должен был пропустить то, что было определено в коде. Так, например:
Список основных циклов слов:
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
Это потратило бы массу времени на вычисления, если бы ему пришлось выполнить код для банана, а также проверить вперед. Вот почему я хотел бы пропустить проверку банана.
Вы можете явно использовать метод 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))
, чтобы получить новый список.
Я что-то пропустил?
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
Не может быть наиболее программно эффективным, но, по крайней мере, четким и кратким.
вы можете попытаться использовать модуль itertools и espacially dropwhile.