Як порахувати кількість тире між будь-якими двома буквеними символами?


10

Якщо у нас є рядок з алфавітних символів і деяких тире, і ми хочемо підрахувати кількість тире між будь-якими двома алфавітними символами в цьому рядку. який найпростіший спосіб зробити це?

Приклад:

Вхід: a--bc---d-k

вихід: 2031

Це означає, що є 2 тире між a і b, 0 тире між b і c, 3 тире між c і d і 1 тире між d і k

який хороший спосіб знайти цей вихідний список у python?


3
Ви можете просто спробувати його за допомогою for-loop.
Босейнг Чой

1
@BoseongChoi Так, я, безумовно, спробував цикл, але я переплутався, чи не могли б ви пояснити більше?
Not_Founded

@ Ch3steR Я вважав, що у нас немає такого входу.
Not_Founded

2
Тож і те a-b-cі a-----------bдруге стане однаковим результатом 11?
Купа переповнення

Це дефіси, а не тире.
TRiG

Відповіді:


9

Рішення з регулярним виразом:

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

вихід:

[2, 0, 3, 1]
2031

Рішення з логікою циклу грубої сили:

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)

вихід:

[2, 0, 3, 1]

Я припускаю, що fперед візерунком - друкарська помилка? Вам не потрібно створювати необроблений рядок без зворотних нахилів. Також немає необхідності в групі захоплення =). Приємна відповідь через
JvdV

1
@JvdV Добрий момент f, дякую. Я використовував f-string, але я скинув цю частину під час вдосконалення відповіді, але забув видалити f. Я оновив свою відповідь. Не потрібно групи захоплення також правильно :)
Boseong Choi

1
@Tim No. countдодається лише тоді, resultsколи c != '-'виникає. Якщо xзакінчиться -, остання countбуде проігнорована.
Boseong Choi

11

Ви можете використовувати дуже просте рішення, як це:

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

Вихід:

'2031'


2

Якщо введення може також початися з тире, ви можете використовувати це:

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

Але якщо ваше введення завжди починається з літери, можливо, вам не сподобається 0, яке завжди знаходиться на чолі списку.

Якщо вам потрібен вихід у вигляді рядка ints, ви можете додати це:

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

Ось простий підхід до циклу:

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.