我想创建一个将字符串作为输入的函数,并检查该字符串是否为 pangram(pangram 是一段包含字母表中每个字母的文本)。
我编写了以下代码,该代码有效,但我正在寻找一种替代方法,希望是一种短路方法。
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
我觉得这个问题可能违反了本网站的规则,但希望不是。我只是好奇,希望看到其他方法来做到这一点。
最佳答案
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
Test string
s
is a pangram if we start with the alphabet, remove every letter found in the test string, and all the alphabet letters get removed.
解释
'lambda' 的使用是一种创建函数的方式,因此它相当于编写 def
的一行代码,例如:
def is_pangram(s):
return not set('abcdefghijklmnopqrstuvwxyz') - set(s.lower())
set()
创建一个数据结构,其中不能有任何重复项,这里:
- 第一组是(英文)英文字母,小写
- 第二组是测试字符串中的字符,也是小写的。所有重复项也都消失了。
减去 set(..) - set(..)
返回第一组的内容,减去第二组的内容。 set('abcde') - set('ace') == set('bd')
。
在这个 pangram 测试中:
- 我们将测试字符串中的字符从字母表中取出
- 如果什么都没有,则测试字符串包含所有字母表中的字母,并且必须是 pangram。
如果有剩余,那么测试字符串没有包含所有字母,所以它一定不是全字母组合。
测试字符串集中的任何空格、标点字符都不在字母表集中,因此它们无关紧要。
set(..) - set(..)
将返回空集或包含内容的集。如果我们在 Python 中强制设置为最简单的 True/False 值,则有内容的容器为“True”,空容器为“False”。
所以我们使用 not
来检查“还有剩余的东西吗?”通过将结果强制为 True/False 值,具体取决于是否有剩余。
not
也会更改 True -> False 和 False -> True。这在这里很有用,因为 (alphabet used up) -> 一个空集,它是 False
,但我们希望 is_pangram
返回 True
案子。反之亦然,(字母表有一些剩余)-> 一组 True
的字母,但我们希望 is_pangram
返回 False
那个。
然后返回 True/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
关于python - 如何检查字符串是否是 pangram?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24771381/