Вложенные циклы while не работают

Я пытаюсь использовать цикл while, чтобы найти совпадение между двумя значениями. Один является статическим, а другой является записью в списке. Это код:

 while count != 10:

    for x in rawinput[pos]:
       a = ord(x)
       hash = hash + a

    print hashlist[247]
    print hash
    print wordlist[247]

    while hash != hashlist[247]:
       pass


    print wordlist[247]
    hash = 0 
    count = count + 1

На самом деле хэш ДЕЙСТВИТЕЛЬНО равен хэш-списку[247], но вместо того, чтобы распознать его и продолжить код с помощью print списка слов[247], python зависает во вложенном цикле While. Любые идеи или предложения?

Спасибо!

Изменить: исправлен отступ и удалены ненужные переменные.

Изменить № 2: все переменные определены ранее в скрипте. Это всего лишь фрагмент кода, который вызывает у меня проблемы. Hash и Hashlist[247] равны (каждый из print hash и print hashlist[247] дает 848 на выходе).

Изменить № 3: РЕШЕНО - Спасибо за помощь!


person Insomaniacal    schedule 15.12.2010    source источник
comment
Отступ вашего кода неверен, возможно, это произошло при публикации вопроса. Не могли бы вы отредактировать свой вопрос, вставить исходный код вместо того, что есть сейчас, выделить его и нажать Ctrl-K, чтобы отформатировать правильно?   -  person Tim Pietzcker    schedule 15.12.2010
comment
Извините, я даже не понял, что :/, сейчас репост.   -  person Insomaniacal    schedule 15.12.2010
comment
Каков тип этих значений? Что именно находится в хэш-листе?   -  person Karl Knechtel    schedule 15.12.2010
comment
hash — это встроенная функция в Python. Возможно, вы захотите переименовать эту переменную.   -  person mtrw    schedule 15.12.2010
comment
while hash != hashlist[247]: неверно, если только hashlist не реализует __getitem__ и не делает там что-то особенное (или __eq__).   -  person khachik    schedule 15.12.2010
comment
Хэш-лист — это список чисел, сгенерированный из другого списка. Я попробую изменить имя хэш-переменной и посмотреть, поможет ли это... Я также не совсем уверен, что вы имеете в виду, хачик, почему это не так? В прошлом я всегда указывал позиции в таком списке без каких-либо проблем.   -  person Insomaniacal    schedule 15.12.2010
comment
@ user543790 Я имел в виду: если hash и hashlist[247] не равны, while hash != hashlist[247]: будет бесконечным.   -  person khachik    schedule 15.12.2010
comment
возможно, попробуйте распечатать hash - hashlist[247]. Это может сказать вам, есть ли у вас какая-то проблема с типом ... и если они равны, вы должны получить ноль. Или вы можете просто проверить типы этих переменных с помощью type().   -  person Justin Peel    schedule 15.12.2010
comment
@хачик О, хорошо. Да, я это знаю, я переписал эту версию кода для отладки программы. Однако Hashlist[247] и Hash равны (я подтвердил это вручную, обычно у меня была бы переменная и функция в этом цикле while, но для удобства чтения я разместил это так). @Justin Peel Я попробую этот метод и посмотрю, работает ли он лучше.   -  person Insomaniacal    schedule 15.12.2010
comment
while count != 10: счетчику необходимо присвоить значение перед проверкой, равно ли оно 10 ; если это › 10, то count = count+1 не поможет, если только число не зациклится.   -  person frayser    schedule 15.12.2010
comment
@Frayser - это всего лишь фрагмент кода. Счетчик объявлен как count = 0 в начале скрипта. Я упомяну об этом в ОП.   -  person Insomaniacal    schedule 15.12.2010
comment
print repr(hashlist[247]), repr(hash) и вы обнаружите, что один из них не соответствует вашим ожиданиям.   -  person    schedule 15.12.2010


Ответы (4)


Код, который вы разместили, не содержит циклов while.

while count != 10:

    for x in rawinput[pos]:
       a = ord(x)
       hash = hash + a

Это единственный соответствующий код. Это бесконечный цикл, предполагающий, что счет не начинается с 10.

person Falmarri    schedule 15.12.2010
comment
Когда я опубликовал его, возникла проблема с отступом... В любом случае спасибо за ответ. Второй цикл while должен быть вложен в первый. - person Insomaniacal; 15.12.2010

Вопрос 1: питоновский способ сделать что-то 10 раз — это

for _ in range(10):
    ...

Вопрос 2: очевидно, что Python думает, что hash != hashlist[247], иначе цикл не будет бесконечным. Попробуйте print hash, hashlist[247], hash == hashlist[247] проверить.

Вопрос 3: какой вообще смысл в while cond: pass? Вы пытаетесь делать многопоточные вещи или что-то в этом роде?

person Katriel    schedule 15.12.2010
comment
1: Спасибо, я буду иметь это в виду :) 2: Да, они все равны. Печать двух переменных дает мне 848 каждый раз. 3: Обычно там должна быть функция, но я разместил ее так, чтобы сделать ее читабельной. Спасибо за ваш ответ :) - person Insomaniacal; 15.12.2010
comment
@user: так что ты получаешь, когда делаешь print hash == hashlist[247]? Правда или ложь? - person Katriel; 15.12.2010
comment
Интересно, я ошибаюсь. Я предполагаю, что это означает, что это проблема типа. - person Insomaniacal; 15.12.2010
comment
@user: ну, ты знал, что получишь False, потому что иначе цикл не длился бы вечно! Но теперь, по крайней мере, вы видите, в чем проблема. Вы правы, что это проблема типа: сделайте print type(hash), type(hashlist[247]), чтобы увидеть это. Вы уверены, что один не 847, а другой '847'? - person Katriel; 15.12.2010
comment
Интерпретатор оба раза печатает 848, без кавычек или чего-то еще, но ранее я использовал string.split для создания хэш-листа и забыл преобразовать числа в целые числа. Спасибо за вашу помощь!! - person Insomaniacal; 15.12.2010

Учитывая обновленный пост (с кодом с отступом): верхний уровень while будет бесконечным, если начальное значение count больше 10.

Также, если hash != hashlist[247], следующий цикл тоже будет бесконечным (если нет пользовательских __getitem__, __eq__ и меняющихся значений из другого потока):

...
while hash != hashlist[247]:
   pass
...
person khachik    schedule 15.12.2010

Это произошло из-за того, что хэш и хэш-лист были другого типа:/. ул и внутр. Я проглядел это, так как интерпретатор python ничего не упомянул об ошибке типа, которую я привык делать, и я просто забыл проверить.

Спасибо всем за вашу помощь!

Всем, у кого есть похожая проблема:

ДВАЖДЫ ПРОВЕРЯЙТЕ СВОИ ТИПЫ!!!

person Insomaniacal    schedule 15.12.2010