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".
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
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
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()
.
(\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 .
(.)\1+
É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.
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.
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é