2014-09-09 14 views
0

Я пытаюсь написать цикл while в цикле while, и по какой-то причине он не работает должным образом. Я знаю, что, наверное, здесь нет ничего тривиального, но я просто не понимаю, как он не работает!while-loop in a while-loop python

Целью цикла является сравнение двух строк, чтобы увидеть, одинаково ли они содержат три последовательных слова. Сначала я разделил две строки на списки их соответствующих комбинаций из трех слов, которые я храню в строках списков и stringscompare. Затем я прохожу через каждую строку из трех слов в stringscompare для каждой строки из трех слов в строках.

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

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

например.

«это строка»
«это еще одна строка» --no матч
«это список строк а» - соответствует 'this is a'
«список является строка» - должна соответствовать 'is a string' но в настоящее время не

strings = <list of 3 word strings> [...,...,...] 
stringscompare = <list of 3 word strings to compare> 
v=0, x=0 
while v < len(strings) and stop == False: 
    while x < len(stringscompare) and stop == False: 
     if re.search(strings[v], stringscompare[x]): 
      same.append(dict) 
      stop = True 
     x += 1 
    v +=1 
+0

Без конкретных примеров строк и строк сложно сказать, что здесь происходит не так, но я предполагаю, что во внутреннем цикле stop становится равным True, поэтому внешний цикл завершается. Вы уверены, что это условие и остановка == False во внешнем цикле? – gefei

+0

та же самая идея моя – Synoon

ответ

4

Вы никогда не перезагружаете x внутри внешнего контура. В результате он всегда будет равен или больше len(stringscompare) после первой итерации внешнего цикла.

Установить его 0в внешний контур:

v = 0 
while v < len(strings) and stop == False: 
    x = 0 
    while x < len(stringscompare) and stop == False: 

Другие наблюдения:

Не используйте stop == False где not stop будет делать.

Вы могли бы просто использовать for петлю, затем перерыв дважды:

for s in strings: 
    for sc in stringscompare: 
     if re.search(s, sc): 
      same.append(dict) 
      break 
    else: 
     continue 
    # only reached if the inner loop broke out 
    break 

или использовать any() с выражением генератора, чтобы найти первый матч:

if any(re.search(s, sc) for s in strings for sc in stringscompare): 
    same.append(dict) 
+0

Awesome !! Большое вам спасибо, я смотрел на это часами, и я знал, что это будет что-то глупое! –

+0

И спасибо за ваши наблюдения, ваш путь намного шире! –

+0

@LauraQuinn: рад, что вы нашли более одного ответа, чтобы быть полезным! Примите во внимание, что вы можете присуждать только один * из ответов с 15 очками. Если бы вы знали это и нашли ответ Матаноги, чтобы быть более полезным, то поздравления идут к нему. :-) –

0

использовать дважды ту же переменную стоп, я думаю, вы должны установить конец ложным после цикла:

strings = <list of 3 word strings> [...,...,...] 
stringscompare = <list of 3 word strings to compare> 
v=0, x=0 
while v < len(strings) and stop == False: 
    while x < len(stringscompare) and stop == False: 
     if re.search(strings[v], stringscompare[x]): 
      same.append(dict) 
      stop = True 
     x += 1 
    stop = False 
    v +=1 
0

Я хотел бы предложить что-то вроде этого ..

strings = [] # <list of 3 word strings> [...,...,...] 
stringscompare = [] # <list of 3 word strings to compare> 

stop = False 

for x in strings: 
    if stop: 
     break 

    for v in stringscompare: 
     if re.search(v, x): 
      stop = True 
      break 

A for кажется более уместным. Это то, чего вы пытаетесь достичь?

0

Ну, самая очевидная проблема с кодом здесь заключается в том, что вы не устанавливаете значение X равным 0 после завершения внутреннего цикла. Я объясню: Допустим, что длина «строк» ​​и «строк» ​​равна 3.Когда вы впервые входите в цикл while, v = 0 и x = 0. Когда мы вводим второй цикл, x = 0. Когда мы выходим из второго цикла, если совпадение не найдено, x = length (stringscompare) = 3.

Теперь, когда мы возвращаемся к первому циклу while, он действительно возвращается внутрь цикла, но ничего не делает , поскольку предложение для 2-го цикла не может быть выполнено - X все равно 3!

Вы можете исправить это путем сброса X в конце цикла 2:

strings = <list of 3 word strings> [...,...,...] 
stringscompare = <list of 3 word strings to compare> 
v=0, x=0 
while v < len(strings) and stop == False: 
    while x < len(stringscompare) and stop == False: 
     if re.search(strings[v], stringscompare[x]): 
      same.append(dict) 
      stop = True 
     x += 1 
    x = 0 #resetting X 
    v +=1 

Вы можете легко отслеживать Downs проблемы, как эта по отладке. Есть много способов отладки, его искусство действительно: P То, что я рекомендовал бы вам:

  1. Если your'e с помощью Eclipse, PyCharm и т.д., вы можете использовать встроенный в отладчиках, которые удивительно. Вы можете остановиться в любой точке программы, добавив точки останова, увидеть значение всех переменных и т. Д. Например, в этом случае я бы поставил точку останова на первый оператор цикла ('while v < len ... «). Таким образом, вы можете легко увидеть, что первый цикл на самом деле запущен, а его второй цикл - проблема.

  2. Печать - ваш друг. Что-то простое, как это, например:

v=0, x=0 
while v < len(strings) and stop == False: 
    print "About to enter second loop..." 
    while x < len(stringscompare) and stop == False: 
     if re.search(strings[v], stringscompare[x]): 
      same.append(dict) 
      stop = True 
     x += 1 
    v +=1 

Можно также напечатать значения переменных кстати.

Существует много других способов сделать то, что вы пытаетесь сделать (треугольные графы, расширенные методы поиска, возможно, более сложная структура данных и т. Д.). Но на данный момент - я думаю, что лучше всего для вас - решить проблемы самым простым способом - сосредоточьтесь на написании качественного кода (хорошо названные переменные, отступы, комментарии и т. Д.). Придуманные, «топ-результаты» самые современные трюки придут позже :)

Удачи и получайте удовольствие!

Смежные вопросы