簡體   English   中英

用Python計算字符串中的大寫字母

[英]Count the uppercase letters in a string with Python

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

我只能數小寫字母:

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生成器表達式str.isupper來做到這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
>>>

您可以使用re

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

5

使用lenfilter

import string
value = "HeLLo Capital Letters"
len(filter(lambda x: x in string.uppercase, value))
>>> 5
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()])

我對上面的方法做了一些比較+使用Python 3.7.4編譯的RE
為此,我使用了古騰堡計划的劉易斯卡羅爾所著的《愛麗絲夢游仙境》一書。

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 次循環)

這有效

s = raw_input().strip()
count = 1
for i in s:
    if i.isupper():
        count = count + 1
print count
def n_lower_chars(string):
    return sum(i.isupper() for i in string)

總結生成器表達式中 True 值的數量

(稍微)最快的方法實際上似乎是在frozenset中進行成員資格測試

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
import re
# returns the new string along with the count of replacements.
def count_caps(str):
  new_str, count = re.subn(r'[A-Z]', '', str)
  return count

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM