webentwicklung-frage-antwort-db.com.de

Gibt es eine einfache Möglichkeit, die Anzahl der sich wiederholenden Zeichen in einem Wort zu ermitteln?

Ich versuche, wie viele Zeichen in einem Word wiederholt werden. Die Wiederholungen müssen sequentiell sein. 

Beispielsweise sollte die Methode mit der Eingabe "loooooveee" 6 (4 mal 'o', 2 mal 'e') zurückgeben.

Ich versuche, String-Level-Funktionen zu implementieren, und ich kann das auf diese Weise tun, aber gibt es eine einfache Möglichkeit, dies zu tun? Regex oder andere Dinge?

Bisher habe ich das ausprobiert:

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

Und es gibt 8 mit "loooooveee" zurück.

9
emremrah

Ursprüngliche Frage: order of repetition does not matter

Sie können die Anzahl der eindeutigen Buchstaben nach der Anzahl der Gesamtbuchstaben abziehen. set Wird eine Zeichenfolge angewendet, wird eine eindeutige Sammlung von Buchstaben zurückgegeben.

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

Oder Sie können collections.Counter verwenden, 1 von jedem Wert abziehen, dann sum:

from collections import Counter

c = Counter("loooooveee")

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

Neue Frage: repetitions must be sequential

Sie können itertools.groupby verwenden, um fortlaufende identische Zeichen zu gruppieren:

from itertools import groupby

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

Um die verschachtelten sum-Aufrufe zu vermeiden, können Sie itertools.islice verwenden:

from itertools import groupby, islice

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

Sie können einen regulären Ausdruck verwenden, wenn Sie möchten:

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)

Dies ergibt korrekt 6 und verwendet die Funktion .span().


.__ Der Ausdruck lautet

(\w)\1+

die ein Word-Zeichen (eines von a-zA-Z0-9_) erfasst und versucht, es so oft wie möglich zu wiederholen.
Siehe a Demo auf regex101.com für das sich wiederholende Muster .


Wenn Sie ein beliebiges Zeichen (also nicht nur Word-Zeichen) zuordnen möchten, ändern Sie Ihren Ausdruck in:

(.)\1+

Siehe eine weitere Demo auf regex101.com .

4
Jan

Da es egal ist, wo die Wiederholung stattfindet oder welche Zeichen wiederholt werden, können Sie die in Python bereitgestellte set-Datenstruktur verwenden. Das doppelte Vorkommen eines Zeichens oder eines Objekts wird verworfen.

Daher würde die Lösung ungefähr so ​​aussehen:

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

Dies gibt Ihnen das genaue Ergebnis.

Achten Sie auch auf einige Edge-Fälle, die Sie verwenden sollten, da dies eine gute Praxis ist.

1
Dhruv Joshi

Ich denke, Ihr Code vergleicht die falschen Dinge

Sie beginnen mit der Suche nach dem letzten Zeichen:

char = text[-1]

Dann vergleichen Sie das mit sich selbst:

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

Warum nicht einfach durch die Charaktere laufen?

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

Das scheint zu funktionieren.

1
doctorlove

versuche dies:

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

BEARBEITEN:

gesamtanzahl der Wiederholungen hinzugefügt

1
vencaslac