9

我想创建一个将字符串作为输入的函数,并检查字符串是否为 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

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

4

15 回答 15

18
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' 的使用是一种创建函数的方式,所以它是一行相当于写一个deflike:

 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 值,那么具有内容的容器为“真”,而空容器为“假”。

所以我们not用来检查“有没有剩余的东西?” 通过将结果强制为 True/False 值,具体取决于是否有任何剩余物。

not还会更改 True -> False 和 False -> True。这在这里很有用,因为 (alphabet used up) -> 一个空集 is 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
于 2014-07-16T03:24:21.627 回答
4

你可以使用一些简单的东西:

import string
is_pangram = lambda s: all(c in s.lower() for c in string.ascii_lowercase)
于 2014-07-16T02:48:25.500 回答
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
>>>
于 2014-07-16T03:36:30.507 回答
2
 def pangram(word):
      return all(chr(c+97) in word for c in range(25))
于 2017-10-26T21:40:32.607 回答
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
于 2016-01-03T16:47:11.230 回答
1

我想出了最简单且不使用模块程序的方法。

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)
于 2018-09-17T13:16:47.317 回答
1

这是另一个定义:

def is_pangram(s):
    return len(set(s.lower().replace(" ", ""))) == 26
于 2017-04-14T19:13:36.173 回答
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)

真的

于 2018-07-25T06:18:03.520 回答
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
于 2018-08-06T19:49:49.530 回答
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
于 2018-04-08T23:21:25.323 回答
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
于 2017-11-19T08:02:56.077 回答
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
于 2018-06-19T13:41:13.077 回答
0

我看到这个线程有点老了,但我想我还是会提出我的解决方案。

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
于 2015-08-28T01:31:13.703 回答
-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");
        }
    }
}
于 2015-12-13T09:37:45.320 回答
-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"
于 2016-12-01T12:29:05.497 回答