如何检查字符串是否为全字母句?
我想写一个函数,这个函数可以接收一个字符串作为输入,然后检查这个字符串是否是一个“全字母句”。全字母句就是包含了字母表中每一个字母的文本。
我写了下面的代码,它可以正常工作,但我在寻找一种不同的方法,希望能有更简洁的写法。
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 个回答
你可以简单地检查一下句子里每个小写字母是否都出现过:
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
这段代码主要是用来处理一些特定的任务。它可能涉及到数据的输入、处理和输出。具体来说,代码块中的内容可能包含了一些变量的定义、循环的使用或者条件判断等基本编程概念。
如果你是编程小白,可以把这段代码想象成一个简单的食谱。就像食谱里会告诉你需要哪些材料、怎么做,代码也是在告诉计算机该做什么事情。每一行代码就像是食谱中的一步,按照顺序执行,就能完成一个特定的功能。
总之,这段代码是编程中的一个小部分,理解它的结构和逻辑会帮助你更好地掌握编程的基本知识。
def pangram(word):
return all(chr(c+97) in word for c in range(25))
集合非常适合用来检查某个元素是否存在:
>>> 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
>>>
你可以使用一些很简单的东西,比如:
import string
is_pangram = lambda s: all(c in s.lower() for c in string.ascii_lowercase)
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