【问题标题】:Python Logic Help:Python 逻辑帮助:
【发布时间】:2010-09-02 14:28:11
【问题描述】:

我正在编写一个有两种失败条件的游戏:

  1. 组成一个长度超过 3 个字母的单词。蜜蜂没事,啤酒不行。
  2. 组成一个不能变成更长的单词的单词。斑马还可以,斑马不行。

Wordlist 是单词列表,frag 是前一个片段,a 是玩家输入的新字母。所以 frag 可能看起来像 'app' 和一个可能的 'l' 与形成单词 apple 的想法。

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

由于某种原因,当我输入我的第 4 个字母时,它会自动转到 for 循环中的 else,即使当我在交互式跟踪中的虚拟数据上单独测试时,for 循环中的 if 语句功能正常。

这是 frag alg 和单词列表中带有单词 algebra 的字母 e 的输出。

e

aa : 阿尔格

发现错误

是的

有什么想法吗?

【问题讨论】:

  • Beer 不正常和Zebra 正常的逻辑是什么?规则 1 说它们都不行,规则 2 说它们都行,而您的断言/示例说明了它们的不同之处。对我来说似乎很矛盾。
  • @Alex: Zebra 根据第二个条件是不好的,但不是第一个。 比照Beer。任何一种情况都意味着损失。

标签: python logic


【解决方案1】:

你把事情复杂化了。如果新片段少于3个字母,则自动OK。如果不是,它必须是某个单词的开头并且不是单词本身才可以。

>>> 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 )

【讨论】:

  • 这很好用。我如何学会简化我的代码?
  • 我用伪代码写在白板上。 words 是一个字符串,因此我可以针对当前单词测试特定长度的每个单词。如果它们匹配,那么我们知道至少可以再添加一个字母。
  • @NoahClark:startswithany 等 Python 习语的使用伴随着实践——我记得有人解释了提出它们的最佳方法是“首先假设 Python已经有了一些神奇的功能,可以做你想做的事。”我认为您的伪代码也可能有点低级;在这种情况下,您只需要在考虑如何实现startswith 测试之前弄清楚您想要实现什么逻辑。
  • @NoahClark:如果你写Return True if string is shorter than three characters. Return True if it is not a word but is the start of some other word. Return False otherwise.,那么你已经完成了 90% 的工作。
  • @NoahClark:那么它有点过度嵌套了!定义三个布尔变量,每个测试一个,然后在最后组合它们会更清楚吗?即return too_short or not_a_word and is_a_prefix?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多