Как проверить, является ли строка панграммой?
Я хочу создать функцию, которая принимает строку в качестве входных данных и проверяет, является ли строка панграммой или нет (панграмма - это фрагмент текста, который содержит каждую букву алфавита).
Я написал следующий код, который работает, но я ищу альтернативный способ сделать это, надеюсь, короткий путь.
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
Я придумал самый простой и не использующий модуль программы.
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)
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 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
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
Используя подход ASCII:
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")
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
Я вижу, что эта ветка немного старая, но я все равно решил добавить свое решение.
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
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 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"