it-swarm.com.ru

Есть ли простой способ узнать количество повторяющихся символов в слове?

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

Например, метод с вводом «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".

9
emremrah

Оригинальный вопрос: 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
16
jpp

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

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 для повторяющегося паттерна .


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

(.)\1+

Смотрите другое демо на regex101.com .

4
Jan

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

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

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

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

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

1
Dhruv Joshi

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

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

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

Это похоже на работу.

1
doctorlove

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

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))

Правка:

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

1
vencaslac