Une chaîne 'abc' doit devenir 'a1b1c1'. Chaîne 'aaabcca' - 'a3b1c2a1'

J'ai écrit la fonction python, mais il n'ajoute pas la dernière lettre et 'abc' n'est que 'a1b1'.

string = "aaabbcc"
coded = ''
if len(string) == 0:
   print('')
else:
  count = 1   #start with the first char, not zero!
  prev = string[0]
  for i in range(1,len(string)):
    current = string[i]
    if current == prev:     
       count +=1
    else:              
      coded += prev
      coded += str(count)
      count = 1
      prev = current
      print("coded string: " + coded)
print(coded)
3
ERJAN 20 nov. 2018 à 23:42

4 réponses

Meilleure réponse

Vous oubliez d'ajouter explicitement la toute dernière itération.

string = "aaabb"
coded = ''
if len(string) == 0:
   print('')
else:
  count = 1   #start with the first char, not zero!
  prev = string[0]
  for i in range(1,len(string)):
    current = string[i]
    if current == prev:     
       count +=1
    else:              
      coded += prev
      coded += str(count)
      count = 1
      prev = current
coded += prev       # these two
coded += str(count) # lines

print(coded)

Je préférerais une boucle moins compliquée, à travers:

string = "aaabbcc"
coded = ''
while string:
    i = 0
    while i < len(string) and string[0] == string[i]:
        i += 1
    coded += string[0]+str(i)
    string = string[i:]

print(coded)
1
usr2564301 20 nov. 2018 à 21:01

Utilisez itertools.groupby.

>>> from itertools import groupby
>>> s = 'aaabcca'
>>> ''.join('{}{}'.format(c, sum(1 for _ in g)) for c, g in groupby(s))
'a3b1c2a1'

Détails sur ce que groupby produit:

>>> groups = groupby(s)
>>> [(char, list(group)) for char, group in groups]
[('a', ['a', 'a', 'a']), ('b', ['b']), ('c', ['c', 'c']), ('a', ['a'])]
3
timgeb 20 nov. 2018 à 20:46

Un peu de regex magie:

import re

s = 'aaawbbbccddddd'
counts = re.sub(r'(.)\1*', lambda m: m.group(1) + str(len(m.group())), s)
print(counts)

Le résultat:

a3w1b3c2d5

Détails :

Motif d'expression régulière:

  • (.) - capturer un personnage . (n'importe quel caractère) dans le 1er groupe capturé
  • \1* - correspond à zéro ou plusieurs \1 consécutifs qui sont une référence à la première valeur de groupe capturée (correspondant à une séquence potentiellement du même caractère)

Remplacement:

  • m.group(1) - contient la première valeur de groupe correspondante
  • str(len(m.group())) - obtenir la longueur de la séquence de caractères entière correspondant
3
RomanPerekhrest 21 nov. 2018 à 08:40

Si vous vous demandez pourquoi votre code n'a pas fonctionné ou si vous ne souhaitez pas utiliser de bibliothèques externes, voici la version de travail de votre code

string = "aaabbcc"
coded = ''

if len(string) == 0:
   print('')

else:
  count = 0
  prev = string[0]
  for i in range(1,len(string)):
    current = string[i]
    count +=1

    if current != prev:
      coded += prev
      coded += str(count)
      count = 0

    prev = current

  coded += current
  coded += str(count+1)

print(coded) # -> a3b2c2
1
Filip Młynarski 20 nov. 2018 à 21:08