-1

它是一个检查字符串是否为Pangram的函数,因此如果str1 == 'the quick brown fox jumps over the lazy dog'该函数将返回 True,因为该字符串包含字母表中的每个字母。

import string

def ispangram(str1, alphabet=string.ascii_lowercase):
    for char in set(alphabet): 
        if char in str1:
            return True
        else:
            return False
4

8 回答 8

3

一旦在 中找到第一个字母str1,函数就返回True

你需要做的是:

def ispangram(str1, alphabet=string.ascii_lowercase):
    for char in set(alphabet): 
        if char not in str1:
            return False
    return True

这样,该函数False仅在charis not instr1并且仅在所有字符都存在于str1它返回时才返回True

您可能想要使用str1.lower(),因为您只检查小写字母。

于 2020-06-09T18:12:30.690 回答
1

如其他地方所述,您的逻辑颠倒并且缩进不正确。但是您的设计很好,因为它自然会忽略不是字母的字符。我会添加一些针对混合大小写的防御并稍微简化它:

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.'))
于 2020-06-09T18:34:09.277 回答
1

你不需要set(alphapet),你可以直接迭代alphabet

如果您在该函数将返回的条件下,False则该函数将退出而不执行以下行,因此在完成 for 循环而不返回 false 之后,我们有pangram案例,因此该函数将直接返回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

但是,我们可以使用all()to 来缩短我们的函数

def ispangram(str1, alphabet=string.ascii_lowercase):
    return all([char in  str1 for char in alphabet])
于 2020-06-09T18:31:16.467 回答
1

这是与您不同的方法:

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
于 2020-06-09T18:15:09.183 回答
1

在不确切知道您的函数应该做什么的情况下,我怀疑问题是您在循环的第一次迭代中返回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
于 2020-06-09T18:11:54.713 回答
0

您的函数在检查 的第一个字符后直接返回alphabet,无论该字符是否在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)
于 2020-06-09T18:14:42.150 回答
0

如果在您的字符串中找到任何字母字符,您的函数将返回 True。那是你想要的吗?它遍历 中的汽车set(alphabet),如果其中任何一个在您的字符串if char in str1中,则返回 True。这对您的目标似乎不是很有用。您可能需要更复杂的逻辑,检查字符的顺序,如果您正在查看回文,则字符串在反转时是否相同等。希望这有助于指导您!

于 2020-06-09T18:11:12.723 回答
0

考虑输入"abc"。当您的函数遍历字母表中的字母时,它以 开头"a",看到它在输入字符串中,然后返回True。您需要检查以确保字母表中的所有字母都在输入字符串中

于 2020-06-09T18:12:00.137 回答