问: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个字母。任何人都可以帮我修复代码吗?非常感谢!!!
答案 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
现在代码正常运行