Come contare il numero di trattini tra due caratteri alfabetici?


10

Se abbiamo una stringa di caratteri alfabetici e alcuni trattini e vogliamo contare il numero di trattini tra due caratteri alfabetici qualsiasi in questa stringa. Qual è il modo più semplice per farlo?

Esempio:

Ingresso: a--bc---d-k

produzione: 2031

Ciò significa che ci sono 2 trattini tra aeb, 0 trattini tra b e c, 3 trattini tra c e d e 1 trattino tra d e k

qual è un buon modo per trovare questo elenco di output in Python?


3
Puoi semplicemente provarlo con for-loop.
Boseong Choi,

1
@BoseongChoi Sì, ho sicuramente provato il loop ma mi sono confuso, potresti spiegarmi di più?
Not_Founded

@ Ch3steR Ho considerato che non abbiamo un tale input.
Not_Founded

2
Quindi entrambi a-b-ce a-----------bdiventeranno lo stesso risultato 11?
Heap Overflow

Quelli sono trattini, non trattini.
TRiG

Risposte:


9

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

produzione:

[2, 0, 3, 1]
2031

Soluzione con logica ad anello di forza 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)

produzione:

[2, 0, 3, 1]

Presumo che fdavanti allo schema sia un refuso? Non è necessario creare una stringa non elaborata senza barre rovesciate. Inoltre, non è necessario il gruppo di acquisizione =). Bella risposta attraverso
JvdV il

1
@JvdV Un buon punto per f, grazie. Stavo usando f-string, ma ho lasciato cadere quella parte mentre sto migliorando la risposta, ma ho dimenticato di rimuovere f. Ho aggiornato la mia risposta. Non c'è bisogno di catturare anche il gruppo :)
Boseong Choi il

1
@Tim No. countviene aggiunto solo resultsquando c != '-'viene rilevato. Se xtermina con -, l'ultimo countverrà ignorato.
Boseong Choi,

11

Puoi usare una soluzione molto semplice come questa:

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

Produzione:

'2031'


2

Se l'input può anche iniziare con un trattino, è possibile utilizzare questo:

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

Ma se il tuo input inizia sempre con una lettera, potrebbe non piacerti lo 0 che è sempre in testa alla lista.

Se hai bisogno dell'output come una stringa di ints, puoi aggiungere questo:

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

Ecco un semplice approccio ad anello:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.