2
votes

Python compte le nombre de caractères dans la chaîne

Entrée:

string = 'abbbbccccd'

strList = list(string)
sum = 0

for i , s in enumerate(string):
    # print (strList[i],strList[i+1])

    if strList[i] == strList[i+1]:
        sum = sum + 1
        print(strList[i],'****',sum )

    else:
        sum = sum + 1
        print(strList[i],'****',sum )
        sum = 0

Sortie:

ab4c2d3a3b4e2f2

J'ai essayé comme ci-dessous,

abbbbccdddaaabbbbeeff


10 commentaires

sum est une fonction intégrée :)


Double possible de Comment corriger l'erreur "Index de chaîne hors limites"


Ne devrait-il pas être a1b4c2d3a3b4e2f2 ?


peut-être: strList [-1]


enumerate est également une fonction intégrée


@ Jean-FrançoisFabre sum n'est plus une fonction intégrée - ni aucune fonction du tout - si 0 lui est assigné. Cependant, il en était une avant et cette affectation devrait généralement être évitée car d'autres parties du code pourraient dépendre de la fonction intégrée de somme.


La recherche strList [i + 1] est hors limites car i énumère déjà jusqu'au dernier index valide.


@fabianegli Je sais, c'était juste une blague. Remarquez le smiley.


Je voulais comprendre la logique de l'impression de abb4c2 .. c'est pourquoi j'ai mentionné sans aucune fonction intégrée comme le comptage ou les collections.


@DeveshKumarSingh Non. Je ne veux pas imprimer le nombre si le nombre est égal à 1.


3 Réponses :


6
votes

Dans ces problèmes, gardez toujours l'état actuel (caractère actuel et nombre actuel). Pas besoin d'index, logique plus simple.

Et à la fin, n'oubliez pas de "vider" les données de la boucle courante, sinon vous manquez la dernière itération.

Ma proposition:

ab4c2d3a3b4e2f2

prints:

s = "abbbbccdddaaabbbbeeff"

result = []

current = None
current_count = 0


for c in s:
    if current == c:
        current_count += 1
    else:
        if current_count > 1:
            result.append(str(current_count))
        current_count = 1
        current = c
        result.append(c)

# don't forget last iteration count
if current_count > 1:
    result.append(str(current_count))

print("".join(result))

D'accord, je sais que "" .join (result) invoque un en fonction, mais c'est le moyen le plus efficace. Vous ne voulez pas ajouter caractère par caractère pour créer la chaîne à partir de la liste.

Une fois que vous avez prouvé que vous maîtrisez ces algorithmes, utilisez des éléments intégrés comme itertools.groupby code > faire de tels travaux. C'est plus rapide et sans bogue (ou même mieux: cette autre réponse )


2 commentaires

@ jean-francois-fabre Si on veut ne compter que l'occurrence de caractère on peut utiliser les compteurs non?


vous pouvez utiliser str.count ou utiliser un dictionnaire (ou un collections.Counter ) pour ce faire



0
votes

Vous pouvez utiliser des dictionnaires

a='abbbbccdddaaabbbbeeff'
d=dict()
for i in a:
      if i not in d:d[i]=1
      else:d[i]+=1
for key,value in d.items():
    print(key,value,sep='',end='')

sortie a4b8c2d3e2f2


3 commentaires

Cela renvoie le nombre de chaque alphabet indépendamment de leurs positions. OP demande le nombre d'alphabets consécutifs :)


@ nikhildr22 Le format de la sortie est important ici


@Chris ouais !! J'ai raté cette partie 🤐



2
votes

Vous pouvez utiliser more_itertools:

from more_itertools import run_length

s = "abbbbccdddaaabbbbeeff"
result = ""
for char, num in run_length.encode(s):
    result += f"{char}{num if num != 1 else ''}"
print(result) #returns ab4c2d3a3b4e2f2

EDIT: a manqué la partie sur les fonctions intégrées. Cela utilise une bibliothèque externe. Laisser ici parce que je trouve le problème initial très intéressant.


1 commentaires

ce n'est pas grave si vous me demandez. La fonction que vous avez mentionnée pourrait aussi être copiée en tant que code source ... ce serait aussi bien que de copier ma solution :)