我试图找出如何计算字符串中的大写字母。
我只能计算小写字母:
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))
答案 0 :(得分:40)
您可以使用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
>>>
答案 1 :(得分:6)
使用len
和filter
:
import string
value = "HeLLo Capital Letters"
len(filter(lambda x: x in string.uppercase, value))
>>> 5
答案 2 :(得分:4)
您可以使用re
:
import re
string = "Not mAnY Capital Letters"
len(re.findall(r'[A-Z]',string))
5
答案 3 :(得分:2)
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()])
答案 4 :(得分:1)
这有效
s = raw_input().strip()
count = 1
for i in s:
if i.isupper():
count = count + 1
print count
答案 5 :(得分: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
答案 6 :(得分:0)
我对上述方法+使用RE编译的方法做了一些比较
Python 3.7.4
为此,我使用了Gutenberg项目的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 ms±94.6 µs(平均±标准偏差,共运行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 ms±13 µs(平均±标准偏差,共运行7次,每个循环1000次)
%%timeit
cnt = [regex_compiled(ch) for ch in chaps]
每个循环1.45 ms±8.69 µs(平均±标准偏差,共运行7次,每个循环1000次)
答案 7 :(得分:0)
def n_lower_chars(string):
return sum(i.isupper() for i in string)
总结生成器表达式中True值的数量