Поиск одинаковых символов идущих подряд (от 2 до 9)
Всем привет!
Написал функцию, которая проверяет наличие одинаковых цифр идущих подряд, и показывает количество таких блоков.
Выдаёт список с циферками которые показывают сколько блоков есть и по сколько повторений в каждом.
Но меня не оставляют мысли, что можно было сделать это аккуратнее и компактнее.
Подскажите есть какие то библиотеки, функции, регулярки для подобного рода задач?
def check_repeat_digits(55533):
a = 0
score = 0
score_mass = []
sid = str(id)
for i in sid:
try:
# проверка среза есть ли в нём дубликаты and предотвращаем выход за границы
if len(set(sid[a:a+2])) == 1 and a < len(sid)-1: если ОК то
score += 1
# если блок одинаковых цифр прервался, заносим инфу в список, и обнуляемся
elif score > 0:
# +1 что бы корректно отображалось кол-во символов в блоке
score_mass.append(score+1)
score = 0
else:
a += 1
continue
except:
exit()
a += 1
print(score_mass)
>>> [3, 2]
Ответы (3 шт):
Вам возможно понравится класс Counter из стандартной библиотеки collection.
Более подробно с этим и другими полезными классами вы можете ознакомится по ссылке.
Прикрепляю альтернативу вашей функции с использованием данного класса. Если что непонятно - пишите, прокомментирую. Единственное отличие что моя реализация выходит за ограничения с поиском одинаковых цифр от 2 до 9, но мне кажется, что рассмотрев более общий вариант куда легче написать частный с дополнительным условием.
def check_repeat_digits(number):
print([val for key, val in Counter([int(i) for i in str(number)]).items()])
используйте регулярку
import re
res = re.findall(r"((\d)\2{1,})", "5551888337771234555")
print(res)
если вам надо искать не 2 и больше, а N и больше символов, то укажите кол-во символов в {1,}
(от 2 до 9)
будет означать {1,8}
т.е. ваш код будет выглядеть так:
import re
def check_repeat_digits(value):
return [len(obj[0]) for obj in re.findall(r"((\d)\2{1,8})", str(value))]
Для общей задачи группировки есть библиотечная функция. Ну для Вашей задачи можно еще отфильтровать группы с длиной 1
import itertools
print([(len(list(g[1])), g[0]) for g in itertools.groupby('5551888337771234555')])