需要有关Python的帮助

时间:2014-09-10 15:52:27

标签: python pangram

问:pangram是一个句子,其中包含至少一次英文字母的所有字母,例如:快速的棕色狐狸跳过懒狗。你在这里的任务是编写一个函数来检查一个句子,看它是否是一个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 = [&#34;快速的棕色狐狸跳过懒狗&#34;],结果是假的,这是错误的。它应该是真的b / c它包含所有26个字母。任何人都可以帮我修复代码吗?非常感谢!!!

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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")

答案 2 :(得分: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

答案 3 :(得分:0)

如果s是array()s = [“快速的棕色狐狸跳过懒狗”]你只能得到len()= 1,那么if len(s)&lt; 26:总是返回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")

答案 4 :(得分: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

现在代码正常运行