【问题标题】:How to check if string is a pangram?如何检查字符串是否为pangram?
【发布时间】:2014-09-06 10:14:11
【问题描述】:

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

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

【问题讨论】:

  • “一段文字”中可以有标点和空格吗?
  • 我没想到。在上面的代码中,我删除了所有的空格,所以我也会对标点符号做同样的事情。

标签: python string python-2.7 pangram


【解决方案1】:
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。
  • 如果有剩余,那么测试字符串没有包含所有的字母,所以它一定不是pangram。

  • 测试字符串集中的任何空格、标点符号从未出现在字母集中,因此它们无关紧要。

set(..) - set(..) 将返回一个空集或包含内容的集。如果我们在 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

【讨论】:

  • 哇,这个方法太棒了!目前我仍然不明白,但会阅读文档并希望能理解它。
  • 非常感谢!非常感谢您的努力。
【解决方案2】:

你可以使用如下简单的东西:

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

【讨论】:

  • 不错!我觉得它可以做得更短。
  • 对了,all在这里做什么?
  • all() 如果列表中的所有元素都是True,则返回True。定义见documentation
  • all()中的括号可以去掉
  • @monkut 为什么?因为 lambda 表达式?
【解决方案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
>>>

【讨论】:

    【解决方案4】:
     def pangram(word):
          return all(chr(c+97) in word for c in range(25))
    

    【讨论】:

      【解决方案5】:

      简单地检查每个小写字母是否在句子中:

      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
      

      【讨论】:

        【解决方案6】:

        这是另一个定义:

        def is_pangram(s):
            return len(set(s.lower().replace(" ", ""))) == 26
        

        【讨论】:

          【解决方案7】:

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

          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)
          

          【讨论】:

            【解决方案8】:

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

            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
            

            【讨论】:

              【解决方案9】:
              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
              

              【讨论】:

              • 关心:你写pharseletter=""。然后phraseletter= phraseletter +... 下一个错误!
              【解决方案10】:
              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
              

              【讨论】:

              • 这是最完美的答案!
              【解决方案11】:
              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
              

              【讨论】:

              • 请解释您的代码并说明其工作原理。
              【解决方案12】:
              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)
              

              是的

              【讨论】:

                【解决方案13】:
                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
                

                【讨论】:

                  【解决方案14】:
                  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");
                          }
                      }
                  }
                  

                  【讨论】:

                    【解决方案15】:
                    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"
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-10-19
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-11-25
                      相关资源
                      最近更新 更多