【问题标题】:Count the uppercase letters in a string with Python用 Python 计算字符串中的大写字母
【发布时间】:2013-08-10 09:22:21
【问题描述】:

我想弄清楚如何计算字符串中的大写字母。

我只能数小写字母:

def n_lower_chars(string):
    return sum(map(str.islower, string))

我想要完成的示例:

Type word: HeLLo                                        
Capital Letters: 3

当我尝试翻转上面的函数时,它会产生错误:

def n_upper_chars(string):
    return sum(map(str.isupper, string))

【问题讨论】:

  • 重新阅读这个问题,我看不出sum(map(str.isupper, string)) 不应该工作的任何原因
  • 问题中的代码至少在 python 3.9 中有效。

标签: python string python-3.x count uppercase


【解决方案1】:
def n_lower_chars(string):
    return sum(i.isupper() for i in string)

对生成器表达式中 True 值的个数进行求和

【讨论】:

    【解决方案2】:

    我已经对上面的方法做了一些比较 + RE 编译使用 Python 3.7.4
    为此,我使用了古腾堡计划的 Lewis Carroll 所著的《爱丽丝梦游仙境》一书。

    from urllib.request import urlopen
    
    # Download 
    text = urlopen('https://www.gutenberg.org/files/11/11-0.txt').read().decode('utf-8')
    # Split it into the separate chapters and remove table of contents, etc
    sep = 'CHAPTER'
    chaps = [sep + ch for ch in text.split('CHAPTER') if len(ch) > 1000]
    len(chaps)
    

    将所有方法定义为函数,以便在循环中使用它们并保持简洁。

    import re
    import string
    
    def py_isupper(text): 
        return sum(1 for c in text if c.isupper())
    
    def py_str_uppercase(text):
        return sum(1 for c in text if c in string.ascii_uppercase)
    
    def py_filter_lambda(text):
        return len(list(filter(lambda x: x in string.ascii_uppercase, text)))
    
    def regex(text):
        return len(re.findall(r'[A-Z]',text))
    
    # remove compile from the loop
    REGEX = re.compile(r'[A-Z]')
    def regex_compiled(text):
        return len(REGEX.findall(text))
    

    结果如下。

    %%timeit
    cnt = [py_isupper(ch) for ch in chaps]
    

    每个循环 7.84 ms ± 69.7 µs(平均值 ± 标准偏差,7 次运行,每次 100 个循环)

    %%timeit
    cnt = [py_str_uppercase(ch) for ch in chaps]
    

    每个循环 11.9 毫秒 ± 94.6 微秒(7 次运行的平均值 ± 标准偏差,每次 100 次循环)

    %%timeit
    cnt = [py_filter_lambda(ch) for ch in chaps]
    

    每个循环 19.1 ms ± 499 µs(平均值 ± 标准偏差,7 次运行,每次 100 个循环)

    %%timeit
    cnt = [regex(ch) for ch in chaps]
    

    每个循环 1.49 毫秒 ± 13 微秒(平均值 ± 标准偏差,7 次运行,每次 1000 次循环)

    %%timeit
    cnt = [regex_compiled(ch) for ch in chaps]
    

    每个循环 1.45 毫秒 ± 8.69 微秒(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)

    【讨论】:

      【解决方案3】:

      使用 len 和 filter:

      import string
      value = "HeLLo Capital Letters"
      len(filter(lambda x: x in string.uppercase, value))
      >>> 5
      

      【讨论】:

        【解决方案4】:

        这行得通

        s = raw_input().strip()
        count = 1
        for i in s:
            if i.isupper():
                count = count + 1
        print count
        

        【讨论】:

          【解决方案5】:

          这个(稍微)最快的方法实际上似乎是在 freezeset 中进行成员资格测试

          import string
          message='FoObarFOOBARfoobarfooBArfoobAR'
          s_upper=frozenset(string.uppercase)
          
          %timeit sum(1 for c in message if c.isupper())
          >>> 100000 loops, best of 3: 5.75 us per loop
          
          %timeit sum(1 for c in message if c in s_upper)
          >>> 100000 loops, best of 3: 4.42 us per loop
          

          【讨论】:

            【解决方案6】:

            你可以使用re:

            import re
            string = "Not mAnY Capital Letters"
            len(re.findall(r'[A-Z]',string))
            

            5

            【讨论】:

              【解决方案7】:

              您可以使用 sum、generator expression 和 str.isupper 来做到这一点:

              message = input("Type word: ")
              
              print("Capital Letters: ", sum(1 for c in message if c.isupper()))
              

              请看下面的演示:

              >>> message = input("Type word: ")
              Type word: aBcDeFg
              >>> print("Capital Letters: ", sum(1 for c in message if c.isupper()))
              Capital Letters:  3
              >>>
              

              【讨论】:

              • 不错!但是呢:sum(1 for x in message if x.isupper() )?我知道 True 是 '1',但似乎更优雅地求和整数但布尔值,或者不是?
              • 是的 - 我也会采用 (sum 1 for x... 方法来使其明确,而不是指望布尔值恰好具有(由于历史原因)0/1 整数值的性质;)跨度>
              • 相关表格:sum(c in string.uppercase for c in message)
              【解决方案8】:
              from string import ascii_uppercase
              count = len([letter for letter in instring if letter in ascii_uppercase])
              

              这不是最快的方法,但我喜欢它的可读性。另一种方法是:

              count = len([letter for letter in instring if letter.isupper()])
              

              【讨论】:

              • 我同意。有了这个,我可以看到发生了什么。
              • @Stevenson 你也可以使用uppercase 而不是ascii_uppercase,如果你觉得它更易读的话。你可以阅读这两个here之间的区别。
              • 太棒了..这让我有更好的理解!很好的链接
              猜你喜欢
              • 1970-01-01
              • 2011-10-02
              • 2020-01-04
              • 2020-08-28
              • 2014-10-03
              • 2014-07-17
              • 2017-03-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多