Вижу несколько разных вопросов:
Как произвести подсчет числа прописных букв в тексте просто?
Как произвести подсчет числа прописных букв в тексте быстро?
Что за хрень я написал и почему она не работает?
# просто и быстро
STR_TEXT = "Требуется произвести подсчет числа прописных букв в тексте."
AllCapitalLetters = set("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ")
CapitalInTEXT = [c for c in STR_TEXT if c in AllCapitalLetters]
print(CapitalInTEXT)
print(len(CapitalInTEXT))
С латиницей прокатил бы такой вариант:
STR_TEXT = "CapitalInTEXT = [c for c in STR_TEXT if 'A' <= c <= 'Z']"
CapitalInTEXT = [c for c in STR_TEXT if 'A' <= c <= 'Z']
С кириллицей так не выйдет: в юникоде, например
In [1]: ''.join(chr(i) for i in range(1025, 1072))
Out[1]: 'ЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
в других кодировках по-другому.
Чтож, попрактикуемся в бинарном поиске:
AllCapitalLetters = 'ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
# обрати внимание на порядок букв
# на неотсортированном AllCapitalLetters алгоритм виснет
CapitalInTEXT = []
for c in STR_TEXT:
i = 0
j = len(AllCapitalLetters) - 1
while i <= j:
m = (i + j) // 2
cm = AllCapitalLetters[m]
if c > cm:
i = m + 1
elif c < cm:
j = m - 1
else:
CapitalInTEXT.append(cm)
break
Вместо самописа можно воспользоваться стандартной библиотекой:
from bisect import bisect_left
AllCapitalLetters = 'ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
CapitalInTEXT = []
for c in STR_TEXT:
idx = bisect_left(AllCapitalLetters, c)
if idx < len(AllCapitalLetters) and c == AllCapitalLetters[idx]:
CapitalInTEXT.append(c)
По быстродействию простой вариант в 8 раз лучше варианта с bisect и 24 раза лучше самописного.
На этой задаче бинарный поиск бесполезен. А полезен он, например, при поиске ближайших соседей испытуемой буквы, которой в AllCapitalLetters нет, напр. буквы "Ї".