python - 如何检查字符串是否是 pangram?

标签 python string python-2.7 pangram

我想创建一个将字符串作为输入的函数,并检查该字符串是否为 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/

相关文章:

sql-server - 字符串中第一个字符的 T-SQL 索引

java - 如何在 Java 中比较字符串?

python - 使用 Python 通过 PushBullet 向 Android 发送通知

python-2.7 - 在 Python 中根据值查找 Pandas 数据框列

Python:快速和肮脏的数据类型(DTO)

python - 在 Python 类中使用 self(在 Nuke 中制作 GUI)

python - 如何在单元测试中正确修补 boto3 调用

python - 使用 fft2 reshape RGB 滤镜

java - 为字符串中的每个字符分配一组新字符

python-2.7 - 导入错误 : No module named twisted. 互联网