Comment compter le nombre de tirets entre deux caractères alphabétiques quelconques?

10

Si nous avons une chaîne de caractères alphabétiques et quelques tirets, et que nous voulons compter le nombre de tirets entre deux caractères alphabétiques dans cette chaîne. Quelle est la manière la plus simple de faire ça?

Exemple:

Contribution: a--bc---d-k

production: 2031

Cela signifie qu'il y a 2 tirets entre a et b, 0 tiret entre b et c, 3 tirets entre c et d et 1 tiret entre d et k

quelle est la bonne façon de trouver cette liste de sortie en python?

Not_Founded
la source
3
Vous pouvez simplement l'essayer avec for-loop.
Boseong Choi
1
@BoseongChoi Oui, j'ai certainement essayé la boucle mais je suis confus, pourriez-vous s'il vous plaît expliquer plus?
Not_Founded
@ Ch3steR J'ai considéré que nous n'avons pas une telle entrée.
Not_Founded
2
Donc, les deux a-b-cet a-----------bdeviendront la même sortie 11?
Débordement de tas
Ce sont des tirets, pas des tirets.
TRiG

Réponses:

9

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

production:

[2, 0, 3, 1]
2031

Solution avec logique de boucle de force brute:

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)

production:

[2, 0, 3, 1]
Boseong Choi
la source
Je suppose que le fdevant du motif est une faute de frappe? Vous n'avez pas besoin de créer une chaîne brute sans barre oblique inverse. Pas besoin non plus de groupe de capture =). Nice answer through
JvdV
1
@JvdV Bon point pour f, merci. J'utilisais une chaîne f, mais j'ai laissé tomber cette partie pendant que j'améliorais la réponse, mais j'ai oublié de la supprimer f. J'ai mis à jour ma réponse. Pas besoin de groupe de capture aussi à droite :)
Boseong Choi
1
@Tim No. countn'est ajouté qu'au resultsmoment où il c != '-'est rencontré. Si xse termine par -, last countsera ignoré.
Boseong Choi
11

Vous pouvez utiliser une solution très simple comme celle-ci:

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

Production:

«2031»

S3DEV
la source
2

Si votre saisie peut également commencer par un tiret, vous pouvez utiliser ceci:

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

Mais si votre entrée commence toujours par une lettre, vous n'aimerez peut-être pas le 0 qui est toujours en tête de liste.

Si vous avez besoin de la sortie sous forme de chaîne d'entiers, vous pouvez ajouter ceci:

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
la source
1

Voici une approche en boucle 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
la source