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