Bagaimana cara menghitung jumlah tanda hubung antara dua karakter alfabet?

10

Jika kami memiliki string karakter alfabet dan beberapa tanda hubung, dan kami ingin menghitung jumlah tanda hubung antara dua karakter alfabet dalam string ini. apa cara termudah untuk melakukan ini?

Contoh:

Memasukkan: a--bc---d-k

keluaran: 2031

Ini berarti bahwa ada 2 tanda hubung antara a dan b, 0 tanda hubung antara b dan c, 3 tanda hubung antara c dan d dan 1 tanda hubung antara d dan k

apa cara yang baik untuk menemukan daftar keluaran ini dengan python?

Not_Founded
sumber
3
Anda cukup mencobanya dengan for-loop.
Boseong Choi
1
@ BoseongChoi Ya, saya pasti mencoba loop tetapi saya bingung, bisakah Anda menjelaskan lebih lanjut?
Not_Founded
@ Ch3steR Saya menganggap bahwa kami tidak memiliki input seperti itu.
Not_Founded
2
Jadi keduanya a-b-cdan a-----------bakan menjadi output yang sama 11?
Heap Overflow
Itu adalah tanda hubung, bukan tanda hubung.
TRiG

Jawaban:

9

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

keluaran:

[2, 0, 3, 1]
2031

Solusi dengan logika loop brute force:

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)

keluaran:

[2, 0, 3, 1]
Boseong Choi
sumber
Saya berasumsi bahwa fdi depan pola adalah kesalahan ketik? Anda tidak perlu membuat string mentah tanpa garis miring terbalik. Juga tidak perlu untuk menangkap grup =). Jawaban yang bagus sampai
JvdV
1
@ JPV Poin yang bagus untuk f, terima kasih. Saya menggunakan f-string, tetapi saya menjatuhkan bagian itu sementara saya meningkatkan jawabannya, tetapi saya lupa menghapusnya f. Saya memperbarui jawaban saya. Tidak perlu grup tangkap juga kan :)
Boseong Choi
1
@Tim No. counthanya ditambahkan pada resultssaat c != '-'ditemui. Jika xdiakhiri dengan -, yang terakhir countakan diabaikan.
Boseong Choi
11

Anda dapat menggunakan solusi yang sangat sederhana seperti ini:

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

Keluaran:

'2031'

S3DEV
sumber
2

Jika input Anda juga dapat dimulai dengan tanda hubung, Anda dapat menggunakan ini:

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

Tetapi jika input Anda selalu dimulai dengan huruf, Anda mungkin tidak suka 0 yang selalu ada di kepala daftar.

Jika Anda membutuhkan output sebagai string int, maka Anda dapat menambahkan ini:

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
sumber
1

Inilah pendekatan loop sederhana:

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
sumber