İki alfabetik karakter arasındaki tire sayısını nasıl hesaplayabilirim?


10

Alfabetik karakterler dizimiz ve bazı tire işaretlerimiz varsa ve bu dizgideki herhangi iki alfabetik karakter arasındaki tire sayısını saymak istiyoruz. Bunu yapmanın en kolay yolu nedir?

Misal:

Giriş: a--bc---d-k

çıktı: 2031

Bu, a ve b arasında 2 çizgi, b ve c arasında 0 çizgi, c ve d arasında 3 çizgi ve d ve k arasında 1 çizgi olduğu anlamına gelir

Bu çıkış listesini python'da bulmanın iyi bir yolu nedir?


3
Sadece for-loop ile deneyebilirsiniz.
Boseong Choi

1
@BoseongChoi Evet, kesinlikle döngü denedim ama kafam karıştı, lütfen daha fazla açıklayabilir misiniz?
Not_Founded

@ Ch3steR Böyle bir girdimiz olmadığını düşündüm.
Not_Founded

2
Her iki yüzden a-b-cve a-----------baynı çıkış girer 11?
Yığın Taşması

Bunlar tire, tire değil.
TRiG

Yanıtlar:


9

Normal ifade ile çözüm:

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

çıktı:

[2, 0, 3, 1]
2031

Kaba kuvvet döngü mantığı ile çözüm:

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)

çıktı:

[2, 0, 3, 1]

Ben fdesen önündeki bir yazım hatası olduğunu varsayalım ? Ters eğik çizgi olmadan ham bir dize oluşturmanız gerekmez. Ayrıca yakalama grubuna gerek yok =). Güzel cevap
JvdV

1
@JvdV İyi bir nokta f, teşekkürler. F-string kullanıyordum, ama cevabı geliştirirken bu kısmı düşürdüm, ama kaldırmayı unuttum f. Cevabımı güncelledim. Yakalama grubuna da gerek yok doğru :)
Boseong Choi

1
@Tim sayılı countsadece eklenen her resultszaman c != '-'karşılaşılan bir durumdur. İle xbiterse -, son countyoksayılır.
Boseong Choi

11

Bunun gibi çok basit bir çözüm kullanabilirsiniz:

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

Çıktı:

'2031'


2

Girdiğiniz bir tire işareti ile de başlayabilirseniz, bunu kullanabilirsiniz:

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

Ancak girdiniz her zaman bir harfle başlıyorsa, her zaman listenin başında bulunan 0'ı beğenmeyebilirsiniz.

Çıktıya bir dize dizesi olarak ihtiyacınız varsa, bunu ekleyebilirsiniz:

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

1

İşte basit bir döngü yaklaşımı:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.