J'ai une chaîne, un motif, je dois compter le nb d’occurrence de ce motif dans ma chaîne :
def fct(chaîne, motif):
nb = 0
for i in range chaîne:
if chaîne[i]== motif:
nb+=1
i+=1
return nb
Me renvoie le message du titre du topic avec chaîne[i]== motif
Pourquoi svp ? Comment puis-je y remédier ?
J’y connais rien a python mais il semble que ton i n’est pas un nombre mais une string tu utilises la bonne boucle ?
oui j'ai mis for i in range(0, len(chaîne))
Je vois plusieurs anomalies dans ton code. La première et la plus marquante est le i+1 alors que tu utilises une boucle for. Tu n'as besoin de passer à l'itération suivante de la sorte qu'avec une boucle while. La boucle for se charge elle même de passer à l'itération suivante sans intervention de l'utilisateur. Cela n'engendre pas d'erreur dans ton cas, mais c'est une pratique à éviter. La deuxième erreur tu viens de la corriger dans ton deuxième message.
Sinon je ne comprends pas tes interrogations, je viens d'essayer ton code et il est fonctionnel. A moins que tu recherches à faire autre chose ... Qu'est ce que tu entends par motif ? Une lettre ou un groupe de lettres ? Car la manière pour faire l'un ne sera pas identique à la manière pour faire l'autre.
import re
def getOcc(motif, string):
return len([m.start() for m in re.finditer(motif, string)])
motif='test'
string='test dqs test test qsdqs test'
print(getOcc(motif, string))
#result = 4
Je pars du principe que par motif, tu veux dire substring.
Ici tu ne compare qu'un char à ton motif, donc string, ça ne fera donc pas ce que tu souhaite. Il faut que tu compare des portions complètes de ta chaîne, puis passe à la suite.
Pas de i += 1 sur une boucle for, elle le fait toute seule.
return len([i for i in range(len(string)) if string.startswith(motif, i)])
serait peut être plus adapté. Avec le code au dessus, tu donne une regex, ce qui peut, dans le cas présent, peut être créer un comportement que tu ne souhaites pas.
Il y a aussi la fonction count
Bien vu! Mais est-ce que c'est pas un peu trop facile ?
C'est justement l'intérêt de cette fonction, pourquoi faire compliqué quand on peut faire simple ? D'autant plus que Python comporte pas mal de ce genre de petites fonctions pour se faciliter la vie, c'est plutôt intéressant de les connaître.
Je pense que si l'auteur voulait implémenter un algorithme particulier il l'aurait sûrement precisé ou aurait au moins manifesté un intérêt pour l'algorithmique dans son premier message.
Le 11 novembre 2019 à 19:24:37 AsariTech a écrit :
C'est justement l'intérêt de cette fonction, pourquoi faire compliqué quand on peut faire simple ? D'autant plus que Python comporte pas mal de ce genre de petites fonctions pour se faciliter la vie, c'est plutôt intéressant de les connaître.
Je pense que si l'auteur voulait implémenter un algorithme particulier il l'aurait sûrement precisé ou aurait au moins manifesté un intérêt pour l'algorithmique dans son premier message.
D'un point de vue purement fonctionnel, tu as tout à fait raison. Ta solution avec count() est bien meilleurs que la mienne.
C'est parce que j'étais focalisé sur l'algorithmie que j'ai proposé ma réponse, et donc que j'ai donné une solution "compliqué" pour rien. J'étais ironique sur mon dernier message.
Je suis en maths sup (donc débutant en prog) et l'interet de cet algo et justement de ne pas utiliser count car trop facile
Par motif j'entends en effet un ou plusieurs caractère
Le 11 novembre 2019 à 23:02:26 Cuckologue a écrit :
Je suis en maths sup (donc débutant en prog) et l'interet de cet algo et justement de ne pas utiliser count car trop facilePar motif j'entends en effet un ou plusieurs caractère
Dans ce cas je t'ai tout dis.
if chaîne[i]== motif:
Ce code ne peut pas faire ce que tu souhaites, puisqu'il compare chaîne[i] (un seul élément de ta chaîne) à motif, qui est potentiellement une chaîne de plusieurs éléments.
len([i for i in range(len(string)) if string.startswith(motif, i)])
Ici on créer une array qu'on feed avec des indexes.
On fait une boucle sur la chaîne for i in range(len(string))
et on ajoute i à l'array à la condition que string.startswith(motif, i)
retourne true. Soit, qu'à l'indexe i, jusqu'à la fin de la chaîne, il y est la sous-chaîne motif (à partir de l'indexe i).
En suite, on récupère la taille de l'array qui correspond donc au nombre d'occurences.
Sachant qu'on se trimbale une array simplement pour le plaisir d'avoir du one-line, ce n'est, dans l'absolue, pas nécessaire.
Il te faut donc d'abord créer une fonction qui te permets de comparer deux chaînes à partir d'un indexe, qui return true dans le cas où elle à pu identifier motif à partir de l'indexe en question, et de remplacer ton if chaîne[i]== motif:
par if myStartWithImplem(chaîne, i, motif):
.
Merci !