Есть ли простой способ узнать количество повторяющихся символов в слове? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь определить, сколько символов повторяется в слове. Повторения должны быть последовательными.

Например, метод с вводом «loooooveee» должен возвращать 6 (4 раза «o», 2 раза «e»).

Я пытаюсь реализовать функции на уровне строк, и я могу сделать это таким образом, но есть ли простой способ сделать это? Regex, или что-то еще?

Пока я пробовал это:

def measure_normalized_emphasis(text):
    char = text[-1]
    emphasis_size = 0
    for i in range(1, len(text)):
        if text[-i] == char:
            emphasis_size += 1
        else:
            char = text[i - 1]

    return emphasis_size

И он возвращает 8 с "loooooveee".

Ответы [ 5 ]

0 голосов
/ 08 ноября 2018

Я думаю, ваш код сравнивает неправильные вещи

Вы начинаете с нахождения последнего символа:

char = text[-1]

Тогда сравните это с собой:

for i in range(1, len(text)):
    if text[-i] == char: #<-- surely this is test[-1] to begin with?

Почему бы просто не пробежаться по персонажам:

def measure_normalized_emphasis(text):
    char = text[0]
    emphasis_size = 0
    for i in range(1, len(text)):
        if text[i] == char:
            emphasis_size += 1
        else:
            char = text[i]

    return emphasis_size

Кажется, это работает.

0 голосов
/ 08 ноября 2018

Поскольку не имеет значения, где происходит повторение или какие символы повторяются, вы можете использовать структуру данных set, предоставляемую в Python. Он отбрасывает повторяющиеся вхождения любого персонажа или объекта.

Следовательно, решение будет выглядеть примерно так:

def measure_normalized_emphasis(text):
    return len(text) - len(set(text))

Это даст вам точный результат.

Кроме того, не забудьте обратить внимание на некоторые крайние случаи, которые вы должны делать, так как это хорошая практика.

0 голосов
/ 08 ноября 2018

попробуйте это:

word=input('something:')

sum = 0

chars=set(list(word)) #get the set of unique characters

for item in chars: #iterate over the set and output the count for each item
    if word.count(char)>1:
       sum+=word.count(char)
    print('{}|{}'.format(item,str(word.count(char)))

print('Total:'+str(sum))

РЕДАКТИРОВАТЬ:

добавлено общее количество повторений

0 голосов
/ 08 ноября 2018

Вы можете использовать регулярное выражение, если хотите:

import re

rx = re.compile(r'(\w)\1+')

repeating = sum(x[1] - x[0] - 1
                for m in rx.finditer("loooooveee")
                for x in [m.span()])
print(repeating)

Это правильно дает 6 и использует функцию .span().


Выражение
(\w)\1+

, который захватывает символ word (один из a-zA-Z0-9_) и пытается повторять его как можно чаще.
См. демонстрацию на regex101.com для повторяющегося рисунка.


Если вы хотите сопоставить любой символ (т. Е. Не только символы слова), измените выражение на:
(.)\1+

См. еще одну демонстрацию на regex101.com .

0 голосов
/ 08 ноября 2018

Оригинальный вопрос: order of repetition does not matter

Вы можете вычесть количество уникальных букв из общего количества букв. set применительно к строке вернет уникальную коллекцию букв.

x = "loooooveee"
res = len(x) - len(set(x))  # 6

Или вы можете использовать collections.Counter, вычесть 1 из каждого значения, затем sum:

from collections import Counter

c = Counter("loooooveee")

res = sum(i-1 for i in c.values())  # 6

Новый вопрос: repetitions must be sequential

Вы можете использовать itertools.groupby для группировки последовательных идентичных символов:

from itertools import groupby

g = groupby("aooooaooaoo")
res = sum(sum(1 for _ in j) - 1 for i, j in g)  # 5

Чтобы избежать вложенных вызовов sum, вы можете использовать itertools.islice:

from itertools import groupby, islice

g = groupby("aooooaooaoo")
res = sum(1 for _, j in g for _ in islice(j, 1, None))  # 5
...