Jak policzyć liczbę myślników między dowolnymi dwoma znakami alfabetycznymi?

10

Jeśli mamy ciąg znaków alfabetu i niektóre myślniki i chcemy policzyć liczbę myślników między dowolnymi dwoma znakami alfabetu w tym ciągu. jaki jest najłatwiejszy sposób to zrobić?

Przykład:

Wejście: a--bc---d-k

wynik: 2031

Oznacza to, że istnieją 2 myślniki między aib, 0 myślnik międzyb i c, 3 myślniki między cid oraz 1 myślnik między d i k

jaki jest dobry sposób na znalezienie tej listy wyników w Pythonie?

Nie założono
źródło
3
Możesz po prostu spróbować z pętlą for.
Boseong Choi
1
@BoseongChoi Tak, zdecydowanie próbowałem na pętlę, ale jestem zdezorientowany, czy możesz wyjaśnić więcej?
Not_Founded
@ Ch3steR Uważałem, że nie mamy takiego wkładu.
Not_Founded
2
Więc oba a-b-ci a-----------bstaną się tym samym wyjściem 11?
Przepełnienie stosu
To są myślniki, a nie myślniki.
TRiG

Odpowiedzi:

9

Rozwiązanie z wyrażeniem regularnym:

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

wynik:

[2, 0, 3, 1]
2031

Rozwiązanie z logiką pętli siłowej:

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)

wynik:

[2, 0, 3, 1]
Boseong Choi
źródło
Zakładam, że fprzed wzorem jest literówka? Nie musisz tworzyć nieprzetworzonego ciągu bez ukośników. Również nie ma potrzeby przechwytywania grupy =). Ładna odpowiedź przez
JvdV
1
@JvdV Dobry punkt f, dzięki. Używałem f-string, ale upuściłem tę część, poprawiając odpowiedź, ale zapomniałem usunąć f. Zaktualizowałem swoją odpowiedź. Grupa przechwytująca nie musi też mieć racji :)
Boseong Choi
1
@Tim No. countjest dołączany tylko w resultsmomencie c != '-'napotkania. Jeśli xkończy się na -, ostatni countzostanie zignorowany.
Boseong Choi
11

Możesz użyć bardzo prostego rozwiązania takiego jak to:

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

Wynik:

„2031”

S3DEV
źródło
2

Jeśli wpiszesz, możesz także zacząć od myślnika, możesz użyć tego:

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

Ale jeśli twój wpis zawsze zaczyna się od litery, możesz nie polubić 0, która zawsze znajduje się na początku listy.

Jeśli potrzebujesz danych wyjściowych jako ciągu liczb całkowitych, możesz dodać to:

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
źródło
1

Oto proste podejście do pętli:

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
źródło