Wie zähle ich die Anzahl der Striche zwischen zwei alphabetischen Zeichen?

10

Wenn wir eine Zeichenfolge aus alphabetischen Zeichen und einige Bindestriche haben und die Anzahl der Bindestriche zwischen zwei beliebigen alphabetischen Zeichen in dieser Zeichenfolge zählen möchten. Was ist der einfachste Weg, dies zu tun?

Beispiel:

Eingang: a--bc---d-k

Ausgabe: 2031

Dies bedeutet, dass zwischen a und b 2 Striche, zwischen b und c 0 Striche, zwischen c und d 3 Striche und zwischen d und k 1 Striche vorhanden sind

Was ist ein guter Weg, um diese Ausgabeliste in Python zu finden?

Not_Founded
quelle
3
Sie können es einfach mit for-loop versuchen.
Boseong Choi
1
@BoseongChoi Ja, ich habe definitiv versucht, eine Schleife zu erstellen, aber ich bin verwirrt. Könnten Sie bitte mehr erklären?
Not_Founded
@ Ch3steR Ich dachte, dass wir keinen solchen Input haben.
Not_Founded
2
Also beides a-b-cund a-----------bsoll die gleiche Ausgabe werden 11?
Heap Overflow
Das sind Bindestriche, keine Bindestriche.
TRiG

Antworten:

9

Lösung mit Regex:

import re

x = 'a--bc---d-k'

results = [
    len(m) for m in
    re.findall('(?<=[a-z])-*(?=[a-z])', x)
]
print(results)
print(''.join(str(r) for r in results))

Ausgabe:

[2, 0, 3, 1]
2031

Lösung mit Brute-Force-Loop-Logik:

x = 'a--bc---d-k'

count = 0
results = []
for c in x:
    if c == '-':
        count += 1
    else:
        results.append(count)
        count = 0
results = results[1:]  # cut off first length
print(results)

Ausgabe:

[2, 0, 3, 1]
Boseong Choi
quelle
Ich nehme an, das fvor dem Muster ist ein Tippfehler? Sie müssen keine rohe Zeichenfolge ohne Backslashes erstellen. Auch keine Erfassungsgruppe erforderlich =). Schöne Antwort durch
JvdV
1
@JvdV Guter Punkt für f, danke. Ich habe F-String verwendet, aber ich habe diesen Teil entfernt, während ich die Antwort verbessert habe, aber ich habe vergessen, ihn zu entfernen f. Ich habe meine Antwort aktualisiert. Keine Notwendigkeit Capture-Gruppe auch richtig :)
Boseong Choi
1
@Tim No. countwird nur angehängt, resultswenn c != '-'es auftritt . Wenn mit xendet -, wird last countignoriert.
Boseong Choi
11

Sie können eine sehr einfache Lösung wie diese verwenden:

import re

s = 'a--bc---d-k'
# Create a list of dash strings.
dashes = re.split('[a-z]', s)[1:-1]
# Measure the length of each dash string in the list and join as a string.
results = ''.join([str(len(i)) for i in dashes])

Ausgabe:

'2031'

S3DEV
quelle
2

Wenn Ihre Eingabe möglicherweise auch mit einem Bindestrich beginnt, können Sie Folgendes verwenden:

def count_dashes(string):
    all_counts = []
    dash_count = 0
    for char in string:
        if char == "-":
            dash_count += 1
        else:
            all_counts.append(dash_count)
            dash_count = 0
    return all_counts

Wenn Ihre Eingabe jedoch immer mit einem Buchstaben beginnt, gefällt Ihnen möglicherweise nicht die 0, die immer am Anfang der Liste steht.

Wenn Sie die Ausgabe als Ints-Zeichenfolge benötigen, können Sie Folgendes hinzufügen:

def count_dashes(string):
    all_counts = []
    dash_count = 0
    for char in string:
        if char == "-":
            dash_count += 1
        else:
            all_counts.append(dash_count)
            dash_count = 0
    return "".join([str(number) for number in all_counts])
Evan
quelle
1

Hier ist ein einfacher Loop-Ansatz:

myinput = 'a--bc---d-k'
output = []
output_count = -1
for elem in myinput:
  if elem == '-':
    output[output_count] = output[output_count]+1
  else:
    output.append(0)
    output_count += 1

print(output)
Gamopo
quelle