Как посчитать количество тире между любыми двумя алфавитными символами?

10

Если у нас есть строка буквенных символов и несколько штрихов, и мы хотим подсчитать количество штрихов между любыми двумя буквенными символами в этой строке. какой самый простой способ сделать это?

Пример:

Входные данные: a--bc---d-k

вывод: 2031

Это означает, что есть 2 черты между a и b, 0 - между b и c, 3 - между c и d и 1 - между d и k

Что такое хороший способ найти этот список вывода в Python?

Not_Founded
источник
3
Вы можете просто попробовать это с помощью цикла for.
Boseong Choi
1
@BoseongChoi Да, я определенно пытался зациклить, но я растерялся, не могли бы вы объяснить больше?
основано
@ 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]
Boseong Choi
источник
Я предполагаю, что 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'

S3DEV
источник
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, который всегда стоит в начале списка.

Если вам нужен вывод в виде строки целых, то вы можете добавить это:

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
источник
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)
Gamopo
источник