我试图摆脱这个循环。如果单词中的字符不在手上,我会返回False并添加一个中断,这是一个基于Scrabble字母分数的每个字母整数值的字典。这是较大游戏的一部分,但是这个特殊功能会检查我输入的单词是否有效。
现在我遇到的问题是如果输入的单词不在单词列表中,则输入被拒绝并且要求玩家输入另一个单词。但是......如果我输入一个单独的字母,那么手仍然会被更新以删除该字母,因此当我使用所有三个字母重新键入单词时,它不可用。
例如:
如果我的手是
我输入你,我的话将无效,但现在只有r t。因此车辙将不再可用。
在编码的最后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 :(得分:0)
您的代码中存在一些问题,我已经重构它以使其更清晰(并修复它,这就是重点:))
次要问题:
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