我想创建一个函数,该函数将字符串作为输入并检查字符串是否为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
我觉得这个问题可能违反了本网站的规定,但希望它不是。我只是很好奇,并希望看到其他方法来做到这一点。
答案 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。
任何空格,测试字符串集中的标点字符都不会出现在字母集中,所以它们无关紧要。
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"