Como contar o número de traços entre dois caracteres alfabéticos?

10

Se tivermos uma sequência de caracteres alfabéticos e alguns traços, e desejarmos contar o número de traços entre quaisquer dois caracteres alfabéticos nessa sequência. qual é a maneira mais fácil de fazer isso?

Exemplo:

Entrada: a--bc---d-k

resultado: 2031

Isso significa que existem 2 traços entre a e b, 0 traço entre bec, 3 traços entre ce ed 1 traço entre d e k

qual é uma boa maneira de encontrar essa lista de saída em python?

Not_Founded
fonte
3
Você pode simplesmente experimentá-lo com loop for.
Boseong Choi 18/03
11
@BoseongChoi Sim, eu definitivamente tentei fazer loop, mas estou confuso, você poderia explicar mais?
Not_Founded 18/03
@ Ch3steR Eu considerei que não temos essa entrada.
Not_Founded 18/03
2
Então, ambos a-b-ce a-----------bse tornará a mesma saída 11?
Heap Overflow
Esses são hífens, não traços.
TRiG 19/03

Respostas:

9

Solução com 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))

resultado:

[2, 0, 3, 1]
2031

Solução com lógica de loop de força bruta:

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)

resultado:

[2, 0, 3, 1]
Boseong Choi
fonte
Presumo que fna frente do padrão é um erro de digitação? Você não precisa criar uma sequência bruta sem barras invertidas. Também não há necessidade de grupo de captura =). Resposta agradável
JvdV 18/03
11
@JvdV Bom ponto para f, obrigado. Eu estava usando f-string, mas larguei essa parte enquanto aprimorava a resposta, mas esqueci de remover f. Eu atualizei minha resposta. Não precisa capturar grupo também né :)
Boseong Choi 18/03
11
@ Tim No. counté anexado apenas resultsquando c != '-'é encontrado. Se xterminar com -, o último countserá ignorado.
Boseong Choi 19/03
11

Você pode usar uma solução muito simples como esta:

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

Resultado:

'2031'

S3DEV
fonte
2

Se você inserir também pode começar com um traço, use:

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

Mas se sua entrada sempre começa com uma letra, você pode não gostar do 0 que está sempre no topo da lista.

Se você precisar da saída como uma sequência de entradas, poderá adicionar isso:

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

Aqui está uma abordagem simples de loop:

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
fonte