如何检查字符串是否为全字母句?

10 投票
15 回答
17509 浏览
提问于 2025-04-18 13:30

我想写一个函数,这个函数可以接收一个字符串作为输入,然后检查这个字符串是否是一个“全字母句”。全字母句就是包含了字母表中每一个字母的文本。

我写了下面的代码,它可以正常工作,但我在寻找一种不同的方法,希望能有更简洁的写法。

import string

def is_pangram (gram):
    gram = gram.lower()
    gram_list_old = sorted([c for c in gram if c != ' '])
    gram_list = []
    for c in gram_list_old:
        if c not in gram_list:
            gram_list.append(c)
    if gram_list == list(string.ascii_lowercase): return True
    else: return False

我觉得这个问题可能不太符合这个网站的规则,但希望不是。我只是好奇,想看看其他人是怎么做的。

15 个回答

1

你可以简单地检查一下句子里每个小写字母是否都出现过:

text = input()
s = set(text.lower())

if sum(1 for c in s if 96 < ord(c) < 123) == 26:
    print ('pangram')
else:
    print ('not pangram')

或者你也可以把这个过程放在一个函数里:

def ispangram(text):
    return sum(1 for c in set(text.lower()) if 96 < ord(c) < 123) == 26
2

这段代码主要是用来处理一些特定的任务。它可能涉及到数据的输入、处理和输出。具体来说,代码块中的内容可能包含了一些变量的定义、循环的使用或者条件判断等基本编程概念。

如果你是编程小白,可以把这段代码想象成一个简单的食谱。就像食谱里会告诉你需要哪些材料、怎么做,代码也是在告诉计算机该做什么事情。每一行代码就像是食谱中的一步,按照顺序执行,就能完成一个特定的功能。

总之,这段代码是编程中的一个小部分,理解它的结构和逻辑会帮助你更好地掌握编程的基本知识。

 def pangram(word):
      return all(chr(c+97) in word for c in range(25))
3

集合非常适合用来检查某个元素是否存在:

>>> import string
>>> candidate = 'ammdjri * itouwpo ql ? k @ finvmcxzkasjdhgfytuiopqowit'
>>> ascii_lower = set(string.ascii_lowercase)

先把候选项中的空格和标点符号去掉,然后进行测试:

>>> candidate_lower = ascii_lower.intersection(candidate.lower())
>>> ascii_lower == candidate_lower
False

找出缺少了什么:

>>> ascii_lower.symmetric_difference(candidate_lower)
set(['b', 'e'])

再试一次,但这次加上缺少的字母:

>>> candidate = candidate + 'be'
>>> candidate_lower = ascii_lower.intersection(candidate.lower())
>>> ascii_lower == candidate_lower
True
>>>
4

你可以使用一些很简单的东西,比如:

import string
is_pangram = lambda s: all(c in s.lower() for c in string.ascii_lowercase)
19
is_pangram = lambda s: not set('abcdefghijklmnopqrstuvwxyz') - set(s.lower())

>>> is_pangram('abc')
False
>>> is_pangram('the quick brown fox jumps over the lazy dog')
True
>>> is_pangram('Does the quick brown fox jump over the lazy dog?')
True
>>> is_pangram('Do big jackdaws love my sphinx of quartz?')
True

测试字符串 s 是一个全字母句(pangram),如果我们从字母表开始,去掉测试字符串中出现的每个字母,最后字母表中的所有字母都被去掉了。

解释

使用 'lambda' 是一种创建函数的方法,它可以用一行代码来代替写一个 def 函数,比如:

 def is_pangram(s):
     return not set('abcdefghijklmnopqrstuvwxyz') - set(s.lower())

set() 创建了一种数据结构,这种结构里不能有重复的元素。在这里:

  • 第一个集合是小写的(英语)字母表
  • 第二个集合是测试字符串中的字符,也是小写的。而且所有重复的字符都被去掉了。

set(..) - set(..) 这样的操作会返回第一个集合的内容,减去第二个集合的内容。例如:set('abcde') - set('ace') == set('bd')

在这个全字母句的测试中:

  • 我们从字母表中去掉测试字符串中的字符
  • 如果没有剩下的字母,那么测试字符串就包含了字母表中的所有字母,肯定是一个全字母句。
  • 如果还有剩下的字母,那么测试字符串就没有包含所有字母,所以它就不是一个全字母句。

  • 测试字符串中的空格和标点符号从来就不在字母表中,所以它们不重要。

set(..) - set(..) 会返回一个空集合,或者一个有内容的集合。如果我们把集合强制转换成最简单的真/假值,在 Python 中,有内容的集合是 'True',而空集合是 'False'。

所以我们使用 not 来检查“有没有剩下的东西?”通过将结果强制转换成真/假值,来判断是否还有剩余。

not 还会把 True 变成 False,把 False 变成 True。这在这里很有用,因为(字母表用完了)会变成一个空集合,这个空集合是 False,但我们希望 is_pangram 在这种情况下返回 True。反之亦然,(字母表还有剩余)会变成一个字母集合,这个集合是 True,但我们希望 is_pangram 在这种情况下返回 False

最后返回这个真/假结果。

is_pangram = lambda s: not set('abcdefghijklmnopqrstuvwxyz') - set(s.lower())
#      Test string `s`
#is a pangram if
#                           the alphabet letters 
#                                                             minus 
#                                                               the test string letters
#                   has NO leftovers

撰写回答