2016-08-13 60 views
0

我想摆脱这种循环。如果单词中的字符不在手中,我已经返回False并添加了一个中断,这是一个基于拼字游戏字母分数的每个字母具有整数值的字典。这是一个更大的游戏的一部分,但是这个特殊的功能会检查我输入的单词是否有效。返回False以打破循环

现在我遇到的问题是,如果输入的单词不在单词列表中,输入被拒绝并且玩家被要求输入另一单词。但是,如果我输入单个字母作为例子,手仍会更新为删除该字母,因此当我使用全部三个字母重新输入一个单词时不可用。

例如:

如果我的手为rü牛逼

,我输入u,我的话将是无效的,但手现在只包含[R吨。因此,车辙将不再可用。

我对编码最后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循环),但在Python中不存在。任何建议,使这种情况发生?由于我是编程新手,我一直在努力工作。

在此先感谢!

+0

的可能的复制[如何摆脱在Python多个循环?(http://stackoverflow.com/questions/189645/how-to-break-out-of-multiple-loops-in-蟒蛇) –

+0

我已经看了很多次这个问题,并没有对我有很大的意义,这种情况似乎有点不同。我绝对想尽量保持这个代码尽可能简单,因为我在初学者python课程中,并且由于我们还没有学到太多东西,我们期望得到一个简单的答案。另外,我希望获得更多的个性化答案,这就是为什么我花时间和精力来问问题和放置代码的原因。 – Chris

+0

我不完全明白你要求的内容太清楚,但你可以将变量设置为true,并在变量为true时循环,然后在需要跳出循环的任何位置将其设置为false。 – Harrison

回答

0

有在你的代码的几个问题,我已经重构它,使其更清晰(和固定它,那是一点:))

小问题

  • 不是最优的:首先检查单词是否在word_list中(最好使用set而不是列表),然后测试可用字母
  • 几个return语句,然后是break。混乱。

主要问题

主要的问题是,你会影响到remaininghand你改变它,从而破坏你的head每次打电话,说明您所遇到的行为的功能。

你必须复制字典,它会工作。 Python参数是通过引用传递的,所以如果您通过listdict并在函数内修改它,则它将保持修改状态,除非您复制该参数。

中断没有实际问题&返回:我的想法是,当你第一次调用刚刚销毁输入数据时,当你连续调用你的函数几次时,你认为它不起作用。

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