Compter les caractères consécutifs
ÉDITÉ
Comment pourrais-je compter les caractères consécutifs en Python pour voir le nombre de fois que chaque chiffre unique répétitions avant le prochain chiffre unique? Je suis très nouveau à cette langue, donc je suis à la recherche de quelque chose de simple.
Au début, je pensais que je pouvais faire quelque chose comme:
word = '1000'
counter=0
print range(len(word))
for i in range(len(word)-1):
while word[i]==word[i+1]:
counter +=1
print counter*"0"
else:
counter=1
print counter*"1"
De sorte que de cette manière j'ai pu voir le nombre de fois que chaque chiffre unique répète. Mais bien sûr, cela est hors de portée quand i
atteint la dernière valeur.
Dans l'exemple ci-dessus, je voudrais Python pour me dire que 1 répétitions 1, et 0 répète 3 fois. Le code ci-dessus échoue, cependant, à cause de mon instruction while.
Je sais que vous pouvez le faire avec des fonctions intégrées, et préfèrent une solution de cette façon. N'importe qui ont des idées?
source d'informationauteur vashts85
Vous devez vous connecter pour publier un commentaire.
Une solution "de cette façon", avec uniquement des instructions de base:
affichage :
Consécutives compte:
Ooh personne n'a posté
itertools.groupby
encore!Après quoi,
result
ressemble:Et vous pourriez format avec quelque chose comme:
Compte Total:
Quelqu'un dans les commentaires est préoccupé de ce que vous voulez un total nombre de numéros de
"11100111" -> {"1":6, "0":2}
. Dans ce cas, vous souhaitez utiliser uncollections.Compteur
:Votre méthode:
Comme beaucoup l'ont souligné, votre méthode n'est pas parce que vous êtes une boucle dans
range(len(s))
mais la résolutions[i+1]
. Cela conduit à une-par-une erreur lors de lai
est pointé au dernier indice des
donci+1
soulève uneIndexError
. Un moyen de résoudre ce problème serait de faire une boucle parrange(len(s)-1)
mais c'est plus pythonic pour générer quelque chose pour itérer sur.Pour la chaîne qui n'est pas absolument énorme,
zip(s, s[1:])
n'est pas un problème de performance, de sorte que vous pouvez faire:Le seul problème que vous aurez à le cas le dernier caractère si unique. Qui peut être fixé avec
itertools.zip_longest
Si vous ne disposez d'un véritable énorme chaîne et ne peuvent pas se tenir, de tenir deux d'entre eux dans la mémoire à la fois, vous pouvez utiliser le
itertools
recettepar paires
.Totaux (sans les sous-groupes)
Je vais vous donner une brève explication pour les lignes intéressantes.
La ligne ci-dessus est un dictionnaire de compréhension, et il effectue une itération sur les personnages dans
charseq
et crée une paire clé/valeur pour un dictionnaire dont les clés sont le caractère et la valeur est le nombre de fois où il a été rencontré jusqu'à présent.Puis vient la boucle:
Nous à partir de
0
àlength - 1
pour éviter de sortir des limites du terrain avec lac+1
indexation dans la boucle du corps.À ce stade, chaque match que nous rencontrons, nous le savons, consécutifs, nous avons simplement ajouter 1 à la touche de caractère. Par exemple, si l'on prend un instantané d'une itération, le code pourrait ressembler à ceci (à l'aide directe des valeurs au lieu de variables, à des fins d'illustration):
Vous pouvez voir le programme de la sortie ci-dessous avec le bon compte:
Vous avez seulement besoin de changer
len(word)
àlen(word) - 1
. Cela dit, vous pouvez également utiliser le fait queFalse
's la valeur est 0 etTrue
'a la valeur 1 avecsum
:Ce produit de la somme de
(False, True, True, False)
oùFalse
est 0 etTrue
est 1 - qui est ce que vous êtes après.Si vous voulez que ce soit sûr vous devez vous prémunir des mots vides (indice -1 accès):
Et ce qui peut être amélioré avec
zip
:C'est mon code simple pour trouver maximum nombre de jours 1 à binaray chaîne de caractères en python 3:
Unique méthode:- Dans le cas où si vous êtes simplement à la recherche pour le comptage consécutifs 1
À l'aide de Peu de Magie: L'idée est basée sur le concept que si nous ET une séquence de bits avec un décalage d'une version de lui-même, nous sommes effectivement suppression de l'arrière 1 à partir de toutes les séquences consécutives de 1s.
de fuite 1 supprimé
Si l'opération x = (x & (x << 1)) réduit la durée de chaque séquence de 1s par un dans la représentation binaire de x. Si nous continuer à faire cette opération dans une boucle, nous nous retrouvons avec x = 0. Le nombre d'itérations nécessaires pour atteindre 0 est en fait la longueur de la plus longue consécutifs de la séquence de 1s.