我的python pangram函数有什么问题

我的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

它是一个检查字符串是否为字符串的函数 因此,如果str1=='敏捷的棕色狐狸跳过懒惰的狗'函数将返回True,因为字符串包含字母表中的每个字母

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()
,而它只需要小写一次。