2016-08-13 3 views
0

Я пытаюсь вырваться из этого цикла. Я вернул False и добавил перерыв, если символ в слове не находится на руке, который является словарем с целыми значениями на букву, основанным на знаках букв Scrabble. Это часть более крупной игры, но эта конкретная функция проверяет, действительно ли введенное мной слово.Возвращение False для выхода из цикла

Теперь проблема заключается в том, что введенное слово отсутствует в списке слов, вход отклонен, и игроку предлагается ввести другое слово. ОДНАКО ... если я введу, например, одну букву, рука все еще обновляется, чтобы удалить это письмо, и поэтому недоступно, когда я перепечатываю слово, используя все три буквы.

Например:

если моя рука г у т

и я вхожу U, мое слово будет недействительна, но рука теперь содержит только г т. Поэтому колея больше не будет доступна.

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

Вот код:

def is_valid_word(word, hand, word_list): 
""" 
Returns True if word is in the word_list and is entirely 
composed of letters in the hand. Otherwise, returns False. 
Does not mutate hand or word_list. 

word: string 
hand: dictionary (string -> int) 
word_list: list of lowercase strings 
""" 

    remaining = hand 
    for c in word: 
     if c not in remaining.keys(): """Loop 1""" 
      return False 
      break 
     if c in remaining.keys():  """Loop 2""" 
      remaining [c] -= 1 
     if remaining [c] < 0:  """Loop 3""" 
      return False 
    if word in word_list: 
     return True 
    else: 
     return False 

Однако я структурировать петли в конце концов условие потерпит неудачу. Если я сделаю отступ 2 и 3, то они потерпят неудачу, если письмо не находится в руке, и наоборот. Очевидно, что простое исправление было бы чем-то вроде break (n loops), но этого не существует в Python. Любые предложения, чтобы это произошло? Я работаю над этим долгое время, так как я новичок в программировании.

Заранее благодарен!

+0

Возможный дубликат [Как вырваться из нескольких циклов в Python?] (Http://stackoverflow.com/questions/189645/how-to-break-out-of-multiple-loops-in- python) –

+0

Я рассматривал этот вопрос несколько раз и не имел для меня большого смысла, и сценарий кажется немного другим. Я определенно пытаюсь сохранить этот код как можно более простым, потому что я нахожусь в начинающем курсе python, и ожидается простой ответ, так как мы еще слишком многому научились. Кроме того, я надеялся получить больше персонализированного ответа, поэтому я задал время и усилия, чтобы задать вопрос и поместить код. – Chris

+0

Я не совсем понимаю, о чем вы просите слишком ясно, но вы можете установить переменную в true и loop, пока переменная истинна, а затем установите ее на false, где вам нужно выйти из цикла. – Harrison

ответ

0

Есть несколько проблем в вашем коде, я реструктурировать его, чтобы сделать его более ясным (и установил ее, что был смысл :))

незначительные проблемы:

  • не является оптимальным: сначала проверьте, находится ли слово в word_list (вам лучше использовать set, а не список, будет намного быстрее), затем проверьте доступные буквы
  • несколько операторов return, а затем break. Смешение.

главная проблема:

Основная проблема в том, что вы влияете remaining к hand и изменить его, тем самым разрушая вашу head каждый раз при вызове функции, объясняющую поведение вы испытываете.

Вы должны скопировать словарь, и он будет работать. Параметры Python передаются по ссылке, поэтому, если вы передаете list или dict, и вы изменяете его внутри функции, тогда он остается модифицированным, если вы не сделаете его копию.

Нет реальных проблем с перерывом & возвращает: моя идея в том, что вы думаете, что это не работает, когда вы вызываете свою функцию несколько раз подряд, когда первый вызов просто разрушает ваши входные данные.

def is_valid_word(word, hand, word_list): 
    """ 
    Returns True if word is in the word_list and is entirely 
    composed of letters in the hand. Otherwise, returns False. 
    Does not mutate hand or word_list. 

    word: string 
    hand: dictionary (string -> int) 
    word_list: list of lowercase strings 
    """ 
    # make a copy or hand is destroyed by your test 
    remaining = hand.copy() 
    rval = False 

    if word in word_list: 
     rval = True 
     # don't check if word is not in word_list (optim) 
     for c in word: 
      if c not in remaining: # no need to specify keys() 
       rval = False 
       break 

      remaining [c] -= 1 
      if remaining [c] < 0: 
       rval = False 
       break 

    return rval 
+0

Спасибо за совет! Я очень ценю это! – Chris

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