40

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

我只能数小写字母:

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))
4

8 回答 8

67

您可以使用sum生成器表达式和来做到这一点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
>>>
于 2013-08-08T15:20:06.563 回答
14

您可以使用re

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

5

于 2015-06-25T08:05:14.640 回答
12

使用len 和filter

import string
value = "HeLLo Capital Letters"
len(filter(lambda x: x in string.uppercase, value))
>>> 5
于 2013-08-08T15:23:25.297 回答
5

我已经对上述方法 + 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 毫秒 ± 69.7 微秒(平均值 ± 标准偏差。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 毫秒 ± 499 微秒(平均值 ± 标准偏差。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 次循环)

于 2020-04-24T16:24:08.650 回答
4
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()])
于 2013-08-08T15:21:05.517 回答
3
def n_lower_chars(string):
    return sum(i.isupper() for i in string)

总结生成器表达式中 True 值的数量

于 2020-07-31T04:16:54.513 回答
1

这有效

s = raw_input().strip()
count = 1
for i in s:
    if i.isupper():
        count = count + 1
print count
于 2017-06-11T22:08:03.847 回答
0

(稍微)最快的方法实际上似乎是冻结集中的成员资格测试

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
于 2015-09-18T19:52:46.270 回答