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

时间:2014-07-16 02:42:37

标签: 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

我觉得这个问题可能违反了本网站的规定,但希望它不是。我只是很好奇,并希望看到其他方法来做到这一点。

15 个答案:

答案 0 :(得分:14)

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')

在这个pangram测试中:

  • 我们将测试字符串中的字符远离字母
  • 如果没有剩下的,那么测试字符串包含字母表中的所有字母,并且必须是pangram。
  • 如果有剩余的东西,那么测试字符串不包含所有字母,所以它不能是pangram。

  • 任何空格,测试字符串集中的标点字符都不会出现在字母集中,所以它们无关紧要。

set(..) - set(..)将返回一个空集或带有内容的集。如果我们在Python中强制设置为最简单的True / False值,那么内容为“True”的容器和空容器为“False”。

所以我们正在使用not检查“剩下的是什么?”通过强制结果为True / False值,取决于是否有任何剩余。

not也会更改True - &gt;假,假 - &gt;真正。这在哪里很有用,因为(字母用完了) - &gt;一个空集False,但我们希望is_pangram在这种情况下返回True。反之亦然,(字母表中有剩余部分) - &gt;一组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

答案 1 :(得分:5)

您可以使用以下简单的内容:

import string
is_pangram = lambda s: all(c in s.lower() for c in string.ascii_lowercase)

答案 2 :(得分: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
>>>

答案 3 :(得分:2)

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

答案 4 :(得分: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

答案 5 :(得分:1)

这是另一个定义:

def is_pangram(s):
    return len(set(s.lower().replace(" ", ""))) == 26

答案 6 :(得分:0)

使用ASCII aproach:

def checkPan(s):
    alphaT= sum([i for i in range(97,123)]) + 32 
    s = [i.lower() for i in s]
    s = list(set(s))
    sn = sum([ord(i) for i in s])
    if sn==alphaT:
        return("pangram")
    else:
        return("not pangram")

答案 7 :(得分:0)

def panagram(phrase):
alphabet="abcdefghiklmnopqrstuvwxyz"
pharseletter=""
for char in phrase:
    if char in aphabet:
        phraseletter= phraseletter + char
for char in aplhabet:
    if char not in phrase:
        return false

答案 8 :(得分:0)

import string
def ispangram(str, alphabet=string.ascii_lowercase):
    alphabet = set(alphabet)    
    return alphabet <= set(str.lower())

或更简单的方式

def ispangram(str):
    return len(set(str.lower().replace(" ", ""))) == 26

答案 9 :(得分:0)

import string

def is_pangram(phrase, alpha=string.ascii_lowercase):
     num = len(alpha)
     count=0

for i in alpha:
    if i in phrase:
        count += 1
return count == num

答案 10 :(得分:0)

def panagram(str1):
    str1=str1.replace(' ','').lower()
    s=set(str1)
    l=list(s)
    if len(l)==26:
        return True
    return False




str1='The quick brown fox jumps over the dog'
q=panagram(str1)
print(q)
  
    

  

答案 11 :(得分:0)

import string
def ispangram(str1,alphabet=string.ascii.lowercase):  
for myalphabet in alphabet:
    if myalphabet not in str1:
        print(it's not pangram)
        break
    else:
        print(it's pangram)

执行命令:

ispangram("The quick brown fox jumps over the lazy dog")

输出:“这是pangram。” 提示:string.ascii_lowercase返回输出

abcdefghijklmnopqrstuvwxyz

答案 12 :(得分:0)

我想出了最简单的方法,而无需使用模块程序。

def checking(str_word):
b=[]
for i in str_word:
    if i not in b:
        b.append(i)
b.sort()
#print(b)
#print(len(set(b)))
if(len(set(b))>=26):
    print(b)
    print(len(b))
    print(" String is  pangram .")

else:
        print(" String isn't pangram .")
    #b.sort()
#print(b)


str_word=input(" Enter the String :")
checking(str_word)

答案 13 :(得分:-1)

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {

        String s;
        char f;
         Scanner in = new Scanner(System.in);
        s = in.nextLine();

        char[] charArray = s.toLowerCase().toCharArray();
        final Set set = new HashSet();

        for (char a : charArray) {
            if ((int) a >= 97 && (int) a <= 122) {
                f = a;
                set.add(f);
            }

        }
        if (set.size() == 26){
            System.out.println("pangram");
        }
        else {
            System.out.println("not pangram");
        }
    }
}

答案 14 :(得分:-1)

import string
import re
list_lower= list(string.lowercase);
list_upper=list(string.uppercase);
list_total=list_lower + list_upper ;
def is_panagram(temp):
    for each in temp:
        if each not in list_total :
            return 'true'
sample=raw_input("entre the string\n");
string2=re.sub('[^A-Za-z0-9]+', '', sample)
ram=is_panagram(string2);
if ram =='true':
    print "sentence is not a panagram"
else:`enter code here`
    print"sentece is a panagram"