Как проверить, является ли string панграммой?

Я хочу создать функцию, которая принимает строку в качестве входных данных и проверить, является ли строка панграмма или нет (панграмма-текст, который содержит все буквы алфавита).

Я написал следующий код, который работает, но я ищу альтернативный способ сделать это, надеюсь, замкнут путь.

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

Я чувствую, что этот вопрос может быть против правил этого сайта, но надеюсь, это не так. Мне просто интересно и хотелось бы увидеть альтернативу способы сделать это.

16 ответов


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 является панграммой, если мы начнем с алфавита, удалите каждую букву, найденную в тестовой строке, и все буквы алфавита будут удалены.

объяснение

использование "лямбда" - это способ создания функции, поэтому это одна строка, эквивалентная написанию def как:

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

set() создает структуру данных, в которой не может быть дубликатов, и здесь:

  • первый набор является (английский) буквы алфавита, в нижнем регистре
  • второй набор-это символы из тестовой строки, также в нижнем регистре. И все дубликаты тоже исчезли.

вычитание таких вещей, как set(..) - set(..) возвращает содержимое первого набора за вычетом содержимого второго набора. set('abcde') - set('ace') == set('bd').

в этом тесте панграмма:

  • мы убираем символы в тестовой строке из алфавита
  • если ничего не осталось, то тестовая строка содержит все буквы алфавита и должна быть панграммой.
  • если что-то осталось, то тестовая строка не содержит всех букв алфавита, поэтому это не должно быть панграммой.

  • любые пробелы, знаки препинания из набора тестовых строк никогда не были в наборе алфавита, поэтому они не имеют значения.

set(..) - set(..) будет возвращает пустой набор или набор с содержимым. Если мы заставим наборы в простейшие значения True / False в Python, то контейнеры с содержимым будут "True", а пустые контейнеры - "False".

Итак, мы используем not чтобы проверить "есть ли остатки?"путем принуждения результата к значению True / False, в зависимости от того, есть ли какие-либо остатки или нет.

not также изменяет True - > False и False - > True. Что полезно здесь, потому что (алфавит используется) - > пустой набор, который 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

вы можете использовать что-то простое, как:

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

наборы отлично подходят для тестирования членства:

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

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

Как насчет просто проверить, является ли каждый из строчных букв алфавита в предложении:

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 is_pangram(s):
    return len(set(s.lower().replace(" ", ""))) == 26

Я вижу, что эта нить немного старая, но я думал, что все равно добавлю свое решение.

import string

def panagram(phrase):
    new_phrase=sorted(phrase.lower())
    phrase_letters = ""
    for index in new_phrase:
        for letter in string.ascii_lowercase:
            if index == letter and index not in phrase_letters:
                phrase_letters+=letter
    print len(phrase_letters) == 26

или для последней строки:

    print phrase_letters == string.ascii_lowercase

С помощью 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")

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

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

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

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)

правда


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

вывод: "это панграм." Подсказка:string.ascii_lowercase выход возвращает

abcdefghijklmnopqrstuvwxyz

Я придумал самый простой и без использования модуля программы.

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)

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");
        }
    }
}

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"