用 Python 计算字符串中的大写字母
Posted
技术标签:
【中文标题】用 Python 计算字符串中的大写字母【英文标题】:Count the uppercase letters in a string with 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 中有效。
【参考方案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之间的区别。
太棒了..这让我有更好的理解!很好的链接以上是关于用 Python 计算字符串中的大写字母的主要内容,如果未能解决你的问题,请参考以下文章
python 计算数字中的每个数字和非间隔字符串中的每个字母。将它们分组为字典并打印字典。