web-dev-qa-db-fra.com

Existe-t-il un moyen simple d’obtenir le nombre de caractères répétés dans un mot?

J'essaie d'obtenir combien de caractères se répète dans un mot. Les répétitions doivent être séquentielles. 

Par exemple, la méthode avec l'entrée "loooooveee" doit renvoyer 6 (4 fois 'o', 2 fois 'e').

J'essaie d'implémenter des fonctions de niveau chaîne et je peux le faire de cette façon, mais existe-t-il un moyen facile de le faire? Regex, ou une autre sorte de choses?

Jusqu'ici j'ai essayé ceci:

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

Et il retourne 8 avec "loooooveee".

9
emremrah

Question originale: order of repetition does not matter

Vous pouvez soustraire le nombre de lettres uniques du nombre total de lettres. set appliqué à une chaîne retournera une collection unique de lettres.

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

Ou vous pouvez utiliser collections.Counter , soustraire 1 de chaque valeur, puis sum:

from collections import Counter

c = Counter("loooooveee")

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

Nouvelle question: repetitions must be sequential

Vous pouvez utiliser itertools.groupby pour regrouper des caractères identiques séquentiels:

from itertools import groupby

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

Pour éviter les appels sum imbriqués, vous pouvez utiliser 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

Vous pouvez utiliser une expression régulière si vous voulez:

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)

Cela donne correctement 6 et utilise la fonction .span().


L’expression est

(\w)\1+

qui capture un caractère Word (un de a-zA-Z0-9_) et tente de le répéter aussi souvent que possible.
Voir une démonstration sur regex101.com pour le motif de répétition .


Si vous souhaitez faire correspondre un caractère quelconque (c’est-à-dire non seulement des caractères Word), modifiez votre expression comme suit:

(.)\1+

Voir une autre démo sur regex101.com .

4
Jan

Étant donné que la répétition ou les caractères sont répétés, vous pouvez utiliser la structure de données set fournie en Python. Il supprimera les occurrences en double d'un caractère ou d'un objet.

Par conséquent, la solution ressemblerait à ceci:

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

Cela vous donnera le résultat exact.

Assurez-vous également de rechercher certains cas Edge, ce qui est une bonne pratique.

1
Dhruv Joshi

Je pense que votre code compare les mauvaises choses

Vous commencez par trouver le dernier caractère:

char = text[-1]

Ensuite, vous comparez cela à lui-même:

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

Pourquoi ne pas simplement parcourir les personnages:

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

Cela semble fonctionner.

1
doctorlove

essaye ça:

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

MODIFIER:

nombre total de répétitions ajouté

1
vencaslac