IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Exercice chaîne


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut Exercice chaîne
    Bonjour,

    Dans le livre de Swinnen, j'ai un problème avec cet exercice:
    Écrivez un script qui détermine si une chaîne contient ou non le caractère « e ».

    En sachant que pour l'instant, je n'ai vu que les if, else, elif, while, len().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     >>> ch="Lucie"
    >>> cr="e"
    >>> i=0
    >>> t=0
    >>> a,b=1,0
    >>> while i<len(ch):
    	if ch[i]==cr:			#Si le caractère dans la liste est égal à 1,    		                alors t prend la valeur 1 (comme un On-Off)?#
    		t=1
    	i=i+1
    	print "Le caractère",cr,
    	if t==1:
    		print "est présent",a,"fois"
    		a=a+1
    	else:
    		print "est présent",b,"fois"
    Le caractère e est présent 0 fois
    Le caractère e est présent 0 fois
    Le caractère e est présent 0 fois
    Le caractère e est présent 0 fois
    Le caractère e est présent 1 fois

    Ce code marche, mais comment auriez-vous fait en sachant ce que je connais déjà?

    Merci beaucoup!

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Ton idée est bonne mais il vaut mieux afficher le résultat après la boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    # -*- coding: cp1252 -*-
     
    ch="Lucie"
    cr="e"
    nbr = 0
    i = 0
    while i < len(ch):
        if ch[i] == cr:
            nbr += 1
        i += 1
     
    txt = "le caractère " + cr
    if not nbr:
        txt += "n'est pas présent dans la chaine"
    else:
        txt += "est présent " + str(nbr) + " fois"
     
    print txt

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut
    En fait, ma solution n'était pas bonne du tout car elle ajoutait à chaque fois 1.

    Mais j'ai bien compris la tienne. Je ne connaissais pas la fonction if not

    Merci beaucoup.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Par défaut
    Tu peux aussi utiliser plus simplement un 'for' pour ta boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # -*- coding: latin-1 -*-
     
    ch="Lucie"
    cr="e"
     
    res = False
    for one_char in ch:
        if one_char == cr:
            res = True
            break
     
    if res:
        print("Le caractère '%s' est dans la chaine '%s'." %(cr, ch)
    else:
        print("Le caractère '%s' n'est pas dans la chaine '%s'." %(cr, ch)
    Puisque l'énoncé te demande juste si le caractère est présent, pas besoin de le compter Donc tu peux arrêter ton itération avant la fin.

    Et a terme tu feras comme tout le monde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ch="Lucie"
    cr="e"
    if cr in ch:
        print("Le caractère '%s' est dans la chaine '%s'." %(cr, ch)
    else:
        print("Le caractère '%s' n'est pas dans la chaine '%s'." %(cr, ch)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Je viens de le faire également, j'ai trouvé légèrement plus court que vous,

    voilà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    chaine, i, nb_e = "Lucie", 0, 0
    taille = len(chaine)
     
    while (i < taille):
    	if (chaine[i] == 'e'):
    		nb_e = nb_e + 1
    	i = i + 1
     
    print "Il y a", nb_e, "dans la chaine", chaine

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je reprends ton code, devatt. C'est bien.

    Et on peut ajouter:
    - Éviter un indice quand on peut: ça évite aussi de déterminer la longueur de la chaine
    - Pas besoin de parenthèse pour un test unique
    - Notation nb_e += 1 est réputée meilleure.
    J'avoue que je ne sais pas exactement pourquoi. Je crois que c'est parce que ça change l'objet nb_e sur place en mémoire, tandis que nb_e = nb_e + 1 crée un autre objet en mémoire. Sous toute réserve.

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chaine, nb_e = "Lucie danse avec les louves", 0
    for c in chaine:
    	if c == 'e':
    		nb_e += 1
    print "Il y a", nb_e, "'e' dans la chaine", chaine



    Pour faire plus dense encore, on peut intégrer le test dans la formule de nb_e:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chaine, nb_e =  "Lucie danse avec les louves", 0
    for c in chaine:
        nb_e += (c=='e')	
    print "Il y a", nb_e, "'e' dans la chaine", chaine
    Python considère True comme égal à 1 (et réciproquement) et False égal à 0.
    On a gagné une ligne.




    Avec une list comprehension, ça devient jubilatoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chaine = "Lucie danse avec les louves"
    print "Il y a", len([c for c in chaine if c=='e']), "'e' dans la chaine", chaine
    Il n'y a plus qu'une variable et une seule ligne active.


    EDIT:
    Et la ligne active s'amaigrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chaine = "Lucie danse avec les louves"
    print "Il y a", sum([c=='e' for c in chaine]), "'e' dans la chaine", chaine


    Bon, je sais , il y a aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print chaine.count('e')

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Turbo Pascal] Exercice sur une chaîne de caractères
    Par mah00 dans le forum Turbo Pascal
    Réponses: 35
    Dernier message: 10/01/2010, 13h47
  2. Besoin d'exercices sur les chaînes de caractères
    Par Elammath dans le forum Général Python
    Réponses: 7
    Dernier message: 30/06/2008, 13h09
  3. Liste chaînée , exercice simple et perte d'élément
    Par Alternative451 dans le forum C
    Réponses: 1
    Dernier message: 21/04/2008, 15h07
  4. [TP] Chaîne de caractères (exercice)
    Par The future scientist dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 05/05/2007, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo