【问题标题】:Pangram detectionPangram检测
【发布时间】:2021-12-11 07:46:36
【问题描述】:

这里是初学者—— 给定一个字符串,我的代码必须检测它是否是一个 pangram。如果是则返回True,否则返回False。它应该忽略数字和标点符号。

当给出“ABCD45EFGH,IJK,LMNOPQR56STUVW3XYZ”时,它返回无,当给出“这不是一个 pangram!不是一个 pangram”时。当答案应该为 False 时,它​​返回 True。

这不是一个pangram!不是一个pangram。我没看到什么?

import string

def is_pangram(s):
    singlechar = set(s)
    list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    for index, item in enumerate(singlechar):
        if item in list:
            list.remove(item)
            if list:
                return True
                break 
    if not list:
        return False

【问题讨论】:

  • 对于计算机,“A”与“a”不同。不要使用 list 作为变量名,它是保留关键字。您的检查条件必须在您用尽列表或所有单个字符后发生。
  • 你的条件倒退了。 if list 表示你没有使用每个字母,if not list 表示你有。
  • 如果你import string,那么也使用lst = list(string.ascii_lowercase)而不是list = [...](不要使用list作为变量名)

标签: python arrays detection pangram


【解决方案1】:

集合是检查某物是否属于具有交集的两个集合或不属于具有差异的两个集合中的一个的好方法。

在您的情况下,如果您的短语中的字母集与字母 a-z 的交集长度为 26,则它是一个 pangram。

from string import ascii_lowercase

def is_pangram(s):
    return len(set(s.lower()).intersection(ascii_lowercase)) == 26

【讨论】:

  • 你也可以使用return len(...) == len(ascii_lowercase)(IMO 它看起来比一些整数好一点)
  • @Matiiss 我确实考虑过这一点,但考虑到 pangram 的定义是什么,这毫无意义。现在,如果您动态地使用其他集合而不是 ascii_lowercase,那么 len(...) == len(whatever) 将有意义。
【解决方案2】:

您可以继续使用集合及其方法.difference 来确定所有字符的集合中是否有更多字符或没有差异(在此之前,您需要从标点符号中删除字符串(并且空格)并将其变为小写(由.lower.translate.maketrans 字符串方法完成):

import string


def is_pangram(s):
    input_set = set(s.lower().translate(
        str.maketrans('', '', f'{string.punctuation} ')))
    check_set = set(string.ascii_lowercase)
    return not check_set.difference(input_set)


value1 = 'The quick brown fox jumps over a lazy dog!'
print(is_pangram(value1))
# True

value2 = 'This isn\'t a pangram! is not a pangram'
print(is_pangram(value2))
# False

如果您仍想使用列表进行操作:

def is_pangram(s):
    input_set = set(s.lower().translate(
        str.maketrans('', '', f'{string.punctuation} ')))
    lst = list(string.ascii_lowercase)
    for item in input_set:
        if item in lst:
            lst.remove(item)
            if not lst:
                return True
    return False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多