Is there an easy way to get the number of repeating character in a word?

Viewed 666

I'm trying to get how many any character repeats in a word. The repetitions must be sequential.

For example, the method with input "loooooveee" should return 6 (4 times 'o', 2 times 'e').

I'm trying to implement string level functions and I can do it this way but, is there an easy way to do this? Regex, or some other sort of things?

5 Answers

Original question: order of repetition does not matter

You can subtract the number of unique letters by the number of total letters. set applied to a string will return a unique collection of letters.

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

Or you can use collections.Counter, subtract 1 from each value, then sum:

from collections import Counter

c = Counter("loooooveee")

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

New question: repetitions must be sequential

You can use itertools.groupby to group sequential identical characters:

from itertools import groupby

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

To avoid the nested sum calls, you can use itertools.islice:

from itertools import groupby, islice

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

You could use a regular expression if you want:

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)

This correctly yields 6 and makes use of the .span() function.


The expression is

(\w)\1+

which captures a word character (one of a-zA-Z0-9_) and tries to repeat it as often as possible.
See a demo on regex101.com for the repeating pattern.


If you want to match any character (that is, not only word characters), change your expression to:

(.)\1+

See another demo on regex101.com.

try this:

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

EDIT:

added total count of repetitions

Since it doesn't matter where the repetition is occurring or which characters are being repeated, you can make use of the set data structure provided in Python. It will discard the duplicate occurrences of any character or an object.

Therefore, the solution would look something like this:

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

This will give you the exact result.

Also, make sure to look out for some edge cases, which you should as it is a good practice.

I think your code is comparing the wrong things

You start by finding the last character:

char = text[-1]

Then you compare this to itself:

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

Why not just run through the characters:

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

This seems to work.

Related