需要Python帮助

1 投票
5 回答
5040 浏览
提问于 2025-04-20 22:04

问:全字母句是指一个句子里包含了英语字母表中的所有字母,至少出现一次。比如:“The quick brown fox jumps over the lazy dog”就是一个全字母句。你的任务是写一个函数,检查一个句子是否是全字母句。

我现在有的代码是:

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,这个结果是错的。因为这个句子里包含了所有26个字母,应该是True。有没有人能帮我修正这个代码?非常感谢!!!

5 个回答

0

请在以下代码行之后去掉else语句:

if alphabetCount == 26:
    return True

因为这个else语句会让代码在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

现在代码运行得很好了。

0

如果 s 是一个数组,比如 s=["The quick brown fox jumps over the lazy dog"],那么你只能得到长度 len()=1,也就是说这个数组里面只有一个元素。这样的话,如果你检查 len(s) 是否小于 26,那结果总是会是 False,因为 1 肯定小于 26。

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")
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
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")
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。所以你不需要自己写!

不过,值得一提的是,你的算法还是很慢 - 你要遍历字符串26次!为什么不直接写成:

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

撰写回答