¿Cómo contar el número de guiones entre dos caracteres alfabéticos?

10

Si tenemos una cadena de caracteres alfabéticos y algunos guiones, y queremos contar la cantidad de guiones entre dos caracteres alfabéticos en esta cadena. ¿Cuál es la forma más fácil de hacer esto?

Ejemplo:

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

salida: 2031

Esto significa que hay 2 guiones entre a y b, 0 guiones entre b y c, 3 guiones entre c y d y 1 guión entre d y k

¿Cuál es una buena manera de encontrar esta lista de salida en Python?

No encontrado
fuente
3
Simplemente puede probarlo con for-loop.
Boseong Choi
1
@BoseongChoi Sí, definitivamente traté de bucle pero estoy confundido, ¿podría explicar más?
fundada el
@ Ch3steR consideré que no tenemos tal entrada.
fundada el
2
Por lo tanto a-b-c, y a-----------bpasará a ser la misma salida 11?
Heap Overflow
Esos son guiones, no guiones.
TRIG

Respuestas:

9

Solución con expresiones regulares:

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

salida:

[2, 0, 3, 1]
2031

Solución con lógica de bucle de fuerza 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)

salida:

[2, 0, 3, 1]
Boseong Choi
fuente
Supongo que el ffrente del patrón es un error tipográfico? No necesita crear una cadena sin formato sin barras diagonales inversas. Tampoco hay necesidad de capturar grupo =). Buena respuesta a través de
JvdV
1
@JvdV Buen punto para f, gracias. Estaba usando f-string, pero abandoné esa parte mientras mejoraba la respuesta, pero olvidé eliminarla f. Actualicé mi respuesta. No es necesario capturar el grupo también a la derecha :)
Boseong Choi
1
@Tim No. countsolo se agrega resultscuando c != '-'se encuentra. Si xtermina con -, el último countserá ignorado.
Boseong Choi
11

Puede usar una solución muy simple 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])

Salida:

'2031'

S3DEV
fuente
2

Si la entrada también puede comenzar con un guión, puede usar esto:

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

Pero si su entrada siempre comienza con una letra, es posible que no le guste el 0 que siempre está al principio de la lista.

Si necesita la salida como una cadena de entradas, puede agregar esto:

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

Aquí hay un enfoque de bucle simple:

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
fuente