Python的逻辑说明:
我写一个游戏,有两个丢失的条件:Python的逻辑说明:
- 字一次成型超过3个字母长。蜜蜂没事,啤酒不是。
- 形成一个单词,不能做成一个更长的单词。斑马没关系,斑马不是。
Wordlist是单词列表,frag是前一个片段,a是玩家输入的新字母。所以碎片可能看起来像'应用程序',也可能是'l',形成苹果这个词。
def getLoser(frag, a, wordlist):
word = frag + a
if len(word) > 3:
if word in wordlist:
print 'word in wordlist'
return True
else:
for words in wordlist:
if words[:len(word)] == word:
print words,':', word
print 'valid word left'
return False
else:
print words[:len(word)]
print words,':', word
print 'false found'
return True
else:
return False
出于某种原因,当我进入我的第四个字母,它会自动转到其他的for循环,即使在for循环的if语句功能可以正常工作,当我独自一人测试它在虚拟数据互动线索。
这里是frag alg和word单词列表中的单词algebra的字母e的输出。
Ë
AA
AA:水藻
虚假发现
真
任何想法?
你太过复杂了。如果新片段小于3个字母,则它自动成功。如果不是的话,那一定是和这个词的开头不是一个词本身就可以。
>>> words = { "apple" }
>>> def isOK(fragment, letter):
... word = fragment + letter
... if len(word) <= 3: return True
... return word not in words and any(w.startswith(word) for w in words)
...
>>> isOK("a", "p")
True
>>> isOK("ap", "p")
True
>>> isOK("app", "l")
True
>>> isOK("appl", "l")
False
>>> isOK("appl", "e")
False
(这将有可能两种测试相结合以上为一个条件语句:
return len(word) <= 3 or word not in words and any(w.startswith(word) for w in words)
,但我认为这是过于晦涩难懂。)
我不能按照逻辑你的代码在上面;它写得很混乱。 (例如,为什么words
是一个字符串?)在试图实现它之前,尝试使用伪代码编写游戏的逻辑 - 这可以帮助您理清思路。
这里有一个更清晰的版本:
def isOK(word):
condition_one = len(word) > 3 and word in words
condition_two = not any(w.startswith(word) for word in words)
return not(condition_one or condition_two)
这很奇妙。我如何学会简化我的代码? – 2010-09-02 14:41:20
我用白板上的伪代码编写它。单词是一个字符串,所以我可以对当前单词测试一定长度的每个单词。如果它们匹配,那么我们知道至少还可以添加一个字母。 – 2010-09-02 14:45:07
@NoahClark:使用诸如'startswith'和'any'之类的Python成语来实践 - 我记得有人解释了最好的方式来提出他们,“从开始时假设Python已经有一些神奇的功能,你想要什么。”我认为你的伪代码也可能有点低级;在这种情况下,在考虑如何实现'startswith'测试之前,你只需要计算出你想要实现的逻辑。 – katrielalex 2010-09-02 14:49:04
通过什么逻辑是'Beer'不能确定,'Zebra' OK?规则1说他们都不好,规则2说他们都好,你的断言/例子说不同的事情。看起来像对我来说是矛盾的。 – 2010-09-02 14:49:36
@Alex:根据第二种情况,“Zebra”不好,但不是第一种。 * Mutatis变通*为“啤酒”。任何一种情况都意味着损失。 – katrielalex 2010-09-02 14:57:31