我的python pangram函数有什么问题
它是一个检查字符串是否为字符串的函数 因此,如果str1=='敏捷的棕色狐狸跳过懒惰的狗'函数将返回True,因为字符串包含字母表中的每个字母我的python pangram函数有什么问题,python,function,pangram,Python,Function,Pangram,它是一个检查字符串是否为字符串的函数 因此,如果str1=='敏捷的棕色狐狸跳过懒惰的狗'函数将返回True,因为字符串包含字母表中的每个字母 import string def ispangram(str1, alphabet=string.ascii_lowercase): for char in set(alphabet): if char in str1: return True else: re
import string
def ispangram(str1, alphabet=string.ascii_lowercase):
for char in set(alphabet):
if char in str1:
return True
else:
return False
如果在字符串中找到任何字母字符,则函数返回True。这就是你想要的吗?它在
set(alphabet)
中运行,如果字符串if char in str1
,则返回True。这对你的目标似乎不是很有用。您可能需要更复杂的逻辑,检查字符的顺序,如果查看回文,字符串反转时是否相同,等等。希望这有助于指导您 在不知道函数应该做什么的情况下,我怀疑问题在于在循环的第一次迭代中返回True
或False
,因此只分析第一个字母。试试这个:
import string
def ispangram(str1, alphabet=string.ascii_lowercase):
for char in set(alphabet):
if char not in str1:
return False
return True
考虑输入
“abc”
。当函数遍历字母表中的字母时,它以“a”
开头,看到它在输入字符串中,然后返回True
。您需要检查以确保字母表中的所有字母都在输入字符串中一旦在str1
中找到第一个字母,函数将返回True
import string
def ispangram(str1, alphabet=string.ascii_lowercase):
for char in alphabet:
if char not in str1:
return False
return True
str1 = 'the quick brown fox jumps over the lazy dog'
print(ispangram('Hello')) #False
print(ispangram(str1)) #True
您需要做的是:
def ispangram(str1, alphabet=string.ascii_lowercase):
for char in set(alphabet):
if char not in str1:
return False
return True
这样,只有当char
不在str1
中并且只有在str1
中存在所有字符后,函数才会返回False
import string
def ispangram(str1, alphabet=string.ascii_lowercase):
for char in alphabet:
if char not in str1:
return False
return True
str1 = 'the quick brown fox jumps over the lazy dog'
print(ispangram('Hello')) #False
print(ispangram(str1)) #True
您可能希望使用
str1.lower()
,因为您只检查小写字母。您的函数在检查字母表的第一个字符后直接返回,而不管该字符是否在str1
中。实际上,您的函数只是检查字符串中是否有字母表中的某些字符
你打算做的是:
import string
def ispangram(str1, alphabet=string.ascii_lowercase):
for char in set(alphabet):
if char not in str1:
return False
else:
return True
但是,更简单的解决方案是:
def ispangram(str1, alphabet=string.ascii_lowercase)
return set(str1) >= set(alphabet)
以下是与您不同的方法:
import string
def ispangram(str1, alphabet=string.ascii_lowercase):
return len(set(l.lower() for l in str1 if l.lower() in alphabet)) == len(alphabet)
print(ispangram("I am very tired, but I will keep programming to pass the quiz!"))
输出:
False
您不需要设置(alphapet)
,您可以直接迭代字母表
如果您处于函数将返回False
的状态,那么函数将退出而不执行以下行,因此在完成for循环而不返回False之后,我们有pangram case,因此函数将直接返回True
import string
def ispangram(str1, alphabet=string.ascii_lowercase):
for char in alphabet:
if char not in str1:
return False
return True
str1 = 'the quick brown fox jumps over the lazy dog'
print(ispangram('Hello')) #False
print(ispangram(str1)) #True
然而,我们可以将我们的函数缩短为
正如其他地方提到的,您的逻辑颠倒了,并且缩进不正确。但您的设计很好,因为它自然会忽略非字母的字符。我将添加一些针对混合情况的防御措施,并将其稍微简化:
from string import ascii_lowercase as alphabet
def ispangram(string):
string = string.lower()
for character in alphabet:
if character not in string:
return False
return True
print(ispangram('Watch "Jeopardy!", Alex Trebek\'s fun TV quiz game.'))
欢迎来到stackoverflow!为了帮助我们回答您的问题,请提供更多详细信息,包括您的代码的预期输出是什么以及您得到了什么。在第一次点击return
行后,它不是要结束函数(返回True/False
)吗?将if
和return True
翻转到循环外,否则,对于输入字符串中的第一个字符,只返回True。这是否回答了您的问题?您的想法似乎与我的想法相同,但我放弃了set选项,因为通常情况下,pangram不仅仅是包含ascii字符的句子,比如空格或标点符号,这使得集合不匹配。您需要执行类似return set(string.ascii_lowercase)==set([char for char in str1,如果char in string.ascii_lowercase])
或者干脆用=
更好的主意你能解释一下集合(str1)>=集合(字母表):部分吗?哦,这更有意义。非常感谢。set
在中为set(字母表)中的字符做了什么:
?如果不将字母表
转换为集
,它是否也可以正常工作?对于字母表中的字符:
也可以正常工作,但当字符在字母表
中多次出现时,速度可能会慢一些。此外,我正在编辑原始代码,只是指出导致问题的部分,而没有进行可能会混淆实际修复的额外编辑。您不需要显式返回True
和False
,只需返回len(set(…)==len(alphabet)
。函数不需要知道答案,只需要知道调用者。set
在中为set(字母表)中的char做了什么:
?如果不将字母表
转换为集合
,它是否也可以工作?它仍然可以工作,set()
完成的唯一一件事是,在字母表中存在重复项的情况下,这些重复项只需计算一次,在某些情况下,这可能比生成set@AnnZen首先,减少到“一行”并不是所有Python的目标。第二,你搞砸了。通过包含[…]
括号,您使其成为了一个列表
理解,需要在调用all()
之前完成该理解——因此,在第一次未命中时进行快捷键操作会消失,因此它的效率低于我原来的操作。如果您省略了[…]
括号,那么它将是一个生成器表达式,并且会正确地进行快捷操作,在第一次未命中时返回False
。您的函数可以缩短为一行:def ispangram(string):return all(string中的字符。lower()表示字母表中的字符)我同意,从未说过:)仍然,我认为使用all()
会更像python。感谢您提供有关生成器的提示。@AnnZen,您的单行程序在每次迭代中调用string.lower()
,而它只需要小写一次。