1

问:pangram 是一个包含所有英文字母至少一次的句子,例如:The quick brown fox jumps over the lazy dog。你的任务是编写一个函数来检查一个句子,看看它是否是一个 pangram。

我所拥有的是:

def isPangram(s):
    alphabetList = 'abcdefghijklmnopqrstuvwxyz'
    alphabetCount = 0
    if len(s) < 26:
        return False
    else:
        s = re.sub('[^a-zA-Z]','',s).lower()
                for i in range(len(alphabetList)):
            if alphabetList[i] in s:
                alphabetCount = alphabetCount + 1
        if alphabetCount == 26:
            return True
        else:
            return False

但是,当我尝试示例 s=["The quick brown fox jumps over the lazy dog"] 时,结果为 False,这是错误的。它应该是 True b/c 它包含所有 26 个字母。谁能帮我修复代码?非常感谢!!!

4

5 回答 5

3

问题是您传递的是字符串列表而不是列表。"The quick brown fox jumps over the lazy dog"只需不带括号传入,您的代码就可以工作。

您的代码也不必要地复杂(并且错误缩进启动):

if alphabetCount == 26:
    return True
else:
    return False

太复杂了——alphabetCount == 26已经是对或错了!所以你可以简单地写

return alphabetCount == 26

此外,您使用索引变量迭代输入字符串。这完全没有必要,只需遍历输入字符串,如下所示:

for c in alphabetList:
    if c in s:
        alphabetCount += + 1

最重要的是 - 现在已经导致错误,因为否则代码会失败 - 检查len(s) < 26完全是多余的,只需将其删除即可。

字母表也已经内置在 Python 中,它被称为string.ascii_lowercase. 所以你不需要自己写!

话虽如此,您的算法仍然很慢 - 您迭代了 s 26 次!为什么不简单地写

import string
def isPangram(s):
    return set(s.lower()) >= set(string.ascii_lowercase)

于 2014-09-10T15:57:37.730 回答
2

将句子中的字母简化为一个集合,然后验证该集合是所有字母的集合更简单。

def isPangram(s):
    alphabet = set('abcdefghijklmnopqrstuvwxyz')
    s = re.sub('[^a-zA-Z]', '', s)
    sentence = set(s.lower())
    return sentence == alphabet

assert isPangram("The quick brown fox jumped over the lazy dog")
于 2014-09-10T15:57:28.323 回答
1

我会使用套装:

def isPangram(s):
    alphabetset = set('abcdefghijklmnopqrstuvwxyz')
    set_string = set(s.lower())
    return set_string.issuperset(alphabetset)

用法:

>>> isPangram('aabc')
False
>>> isPangram('aabcdefghijklmnopqrstuvwxyz')
True
>>> isPangram('aabcdefghijklmnopqrstuvwxyz J:L FSDJ f09823740235')
True
于 2014-09-10T15:58:07.013 回答
0

请删除以下行后的 else 语句:

if alphabetCount == 26:
    return True

因为它将代码置于 i=0 本身的 else 条件中,因为它只占用一个字母计数。

import re
def isPangram(s):
    alphabetList = 'abcdefghijklmnopqrstuvwxyz'
    alphabetCount = 0
    if len(s) < 26:
        print('lenth is short')
        return False
    else:
        s = re.sub('[^a-zA-Z]','',s).lower()
        print(s)
        for i in range(len(alphabetList)):
            if alphabetList[i] in s:
                print(alphabetList[i])
                print("The string is pangram2")
                alphabetCount = alphabetCount + 1
                print(alphabetCount)
                if alphabetCount >= 26:
                    print("The string is pangram")
                    return True

现在代码运行正常

于 2015-03-04T16:19:11.237 回答
0

if s is array() s=["The quick brown fox jumps over the lazy dog"] 只能得到 len()=1,那么 if len(s) < 26: always return False

def isPangram(s):

    alphabetList = 'abcdefghijklmnopqrstuvwxyz'
    alphabetCount = 0
    if len(s) < 26:
        print "False 1"
    else:
        s = re.sub('[^a-zA-Z]','',s).lower() 
        for i in range(len(alphabetList)):
            if alphabetList[i] in s:
                alphabetCount = alphabetCount + 1
        if alphabetCount == 26:
            print "True"
        else:
            print "False"
a=isPangram("The quick brown fox jumps over the lazy dog")
于 2014-09-10T16:16:23.877 回答