需要Python帮助
问:全字母句是指一个句子里包含了英语字母表中的所有字母,至少出现一次。比如:“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 个回答
请在以下代码行之后去掉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
现在代码运行得很好了。
如果 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")
我会使用集合:
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
把句子里的字母先变成一个集合,这样做会简单一些。然后再检查这个集合是不是包含了所有的字母。
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")
问题在于你传入的是一个字符串列表,而不是一个简单的列表。只需直接传入 "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)