CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [HELP] python "string indices must be integers"

DébutPage précedente
1
Page suivantePage suivante
Cuckologue Cuckologue
MP
Niveau 8
11 novembre 2019 à 13:50:24

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 ?

boucif boucif
MP
Niveau 24
11 novembre 2019 à 14:12:11

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 ?

Cuckologue Cuckologue
MP
Niveau 8
11 novembre 2019 à 14:21:44

oui j'ai mis for i in range(0, len(chaîne))

AsariTech AsariTech
MP
Niveau 7
11 novembre 2019 à 17:03:37

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.

Raidden36 Raidden36
MP
Niveau 6
11 novembre 2019 à 18:08:20
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.

Raidden36 Raidden36
MP
Niveau 6
11 novembre 2019 à 18:19:44

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.

Message édité le 11 novembre 2019 à 18:20:41 par Raidden36
AsariTech AsariTech
MP
Niveau 7
11 novembre 2019 à 18:27:18

Il y a aussi la fonction count :o))

Raidden36 Raidden36
MP
Niveau 6
11 novembre 2019 à 18:38:24

Bien vu! Mais est-ce que c'est pas un peu trop facile ?

AsariTech AsariTech
MP
Niveau 7
11 novembre 2019 à 19:24:37

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.

Raidden36 Raidden36
MP
Niveau 6
11 novembre 2019 à 22:54:20

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.

Message édité le 11 novembre 2019 à 22:54:40 par Raidden36
Cuckologue Cuckologue
MP
Niveau 8
11 novembre 2019 à 23:02:26

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

Raidden36 Raidden36
MP
Niveau 6
12 novembre 2019 à 00:45:54

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 facile

Par 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):.

Cuckologue Cuckologue
MP
Niveau 8
12 novembre 2019 à 18:06:45

Merci !

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment