首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查字符串是否为pangram

检查字符串是否为pangram
EN

Code Review用户
提问于 2015-03-14 00:08:03
回答 4查看 29.9K关注 0票数 12

这个检查器工作得很完美,但是我有一种强烈的感觉,我可以让这个脚本更符合“Python的禅”,特别是最近读了一本关于它的书。毫无疑问,我把这个脚本写得比需要的长得多,所以如果你看到一些我可以缩短的东西,请说出来。

代码语言:javascript
运行
复制
#!/usr/bin/env python

myPhrase = "The quick brown fox jumps over the lazy dog"

def is_pangram(phrase):
    c = 0
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    phraseLetters = ""
    for char in phrase:
        for letter in alphabet:
            if char == letter and char not in phraseLetters:
                phraseLetters += char
    for char in phraseLetters:
        for letter in alphabet:
            if char == letter:
                c += 1
    if c == 26:
        return True
    else:
        print phraseLetters, alphabet
        return False

print is_pangram(myPhrase)
EN

回答 4

Code Review用户

回答已采纳

发布于 2015-03-14 00:46:36

这是可以改进的,使更多的毕达通。首先,有innot in关键字,您在使用它时已经知道了这个关键字。为什么不利用它而不是做两个循环呢?

您必须稍微改变逻辑:

代码语言:javascript
运行
复制
def is_pangram(phrase):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    phraseLetters = ""
    for char in phrase:
       if char in alphabet:
            phraseLetters += char
    for char in alphabet:
        if char not in phrase:
            print phraseLetters, alphabet
            return False
    
    return True

我在phrase中迭代这些字母,检查它们是否在字母表中,并将它们添加到phraseLetters字符串中。然后,我遍历字母表并检查每个字符是否在phrase中。

如果您对打印短语中的字母不感兴趣,这可以进一步简化。我建议进一步削减:

代码语言:javascript
运行
复制
def is_pangram(phrase):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    for char in alphabet:
        if char not in phrase:
            return False
    
    return True

这样,您就可以检查短语是否为pangram,而不必总是打印到屏幕上,这对以后重用代码很有好处;然后可以编写另一种方法来打印短语和字母表中的字符串。此外,我建议按字母顺序打印phrase中的字母,这样就可以很容易地看出哪个字母不在phrase中,这也将使您必须进行的任何潜在调试更加容易。

编辑:

感谢评论中的matsjoyce,您可以进一步简化它:

代码语言:javascript
运行
复制
def is_pangram(phrase):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    return not (set(alphabet) - set(phrase))

通过这种方式,您甚至可以通过删除phrase关键字来返回不在not中的字母,以便于引用,但是您还必须更改方法的名称,因为is_something意味着返回一个布尔值。

此外,您可能应该在所有大写中命名alphabet,以表示它是一个常量变量。

票数 12
EN

Code Review用户

发布于 2015-03-14 00:46:16

我们要检查这个短语是否包含字母表中的所有字母。这种措辞或多或少地暗示了您的代码组织。

让我们将目标重写为等价的:检查字母表中的每个字母是否都在短语中。或者,更简单的说,字母表中没有遗漏任何字母。这种措辞立即导致了更为简单的做法:

代码语言:javascript
运行
复制
for letter in alphabet:
    if not letter in phrase:
        return False

return True
票数 3
EN

Code Review用户

发布于 2015-03-14 12:14:30

我会让固定班来做所有的工作。

代码语言:javascript
运行
复制
english_alphabet = frozenset('abcdefghijklmnopqrstuvwxyz')

def is_pangram(phrase, alphabet=english_alphabet):
    if not isinstance(alphabet, (set, frozenset)): alphabet = set(alphabet)
    return alphabet <= set(x.lower())

集合的使用也自然允许您打印短语中没有的字母。

代码语言:javascript
运行
复制
>>> phrase="The quick red fox jumps over the lazy dog"
>>> sorted(english_alphabet - set(phrase.lower()))
['b', 'n', 'w']
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/84051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档