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 d'insertion d'espaces dans une chaîne de caractères [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Par défaut Exercice d'insertion d'espaces dans une chaîne de caractères
    Bonjour a tous, je suis en train de faire un code sur demande de mon professeur, l'énoncé est le suivant :

    1. Écrire une fonction (cf le prototype ou la signature ci-dessous) qui prend en paramètre une chaîne de caractère (sans espace) et qui insère un espace tous les 4 caractères. Ne pas oublier le docstring.
    Signature : Fonction decoupeChaine(ch : String) : String
    Avec mot=’01234567891011’, print(decoupeChaine(’01234567891011’)) affiche 0123 4567 8910 11
    2. Même question, mais il faut commencer par la fin du mot.
    Signature : Fonction decoupeChaineFin(ch : String) : String
    Avec mot=’01234567891011’, print(decoupeChaineFin(’01234567891011’)) affiche 01 2345 6789 1011


    Je suis bloqué sur la partie deux.

    Voila mon code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    def decoupeChaineFin(mot):
        '''Signature : Fonction decoupeChaine(ch : String) : String'''
    #Variables Espace
        taille = len(mot)
        motRep=""
    #Variable Reverse 1
        listReverse =[]
        motReverse=""
    #Variable Reverse 2
        listReverse2=[]
        motReverse2=""
        tailleReverse=len(motRep)
    #Premier Reverse
        for i in range( taille -1 , -1 , -1) :
            listReverse . append( mot [ i ])
        motReverse=(''.join(listReverse))
    #Espaces
        for i in range (taille):
            if i % 4==0 and i>0:
                motRep = motRep + " " + motReverse[i]
            else:
                motRep = motRep + motReverse[i]
    #Deuxième Reverse
        for i in range( tailleReverse -1 , -1 , -1) :
            listReverse2 . append( motRep [ i ])
        motReverse2=(''.join(listReverse2))
     
        return motReverse2
     
    print(decoupeChaineFin("01234567891011"))
    Si vous pouvez m'aider a trouver mon erreur et m'orienter sur comment résoudre ce problème ça serait super !
    Merci d'avance !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 723
    Par défaut
    Salut,

    Citation Envoyé par Tim._. Voir le message
    Si vous pouvez m'aider a trouver mon erreur et m'orienter sur comment résoudre ce problème ça serait super !
    Prenez n'importe quelle chaine de caractère à découper par paquets de 4.

    Comme sa longueur n'a pas de bonne raison d'être un multiple de 4, sa division (euclidienne) va donner un nombre de paquet q et un reste r.
    Et la différence entre les 2 cas, c'est de savoir si on colle le reste à la fin ou au début...

    Intuitivement, il y a une partie commune:lorsque le reste est nul qui pourrait être fonction ou suite d'instructions répétées. Et 2 partie "spécifiques": traiter deux caractères au début ou à la fin pour passer le reste à la moulinette commune.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Par défaut
    Je crois comprendre votre réponse, problème, je na sais absolument pas comment faire ça

    Edit : Je sais comment le faire mais seulement dans cette situation précise, je voudrais que mon code soit général et marche avec n'importe quel chaine de caractère.

    Edit 2 : De plus le principal problème de mon code actuellement est qu'il ne me retourne rien.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 723
    Par défaut
    Citation Envoyé par Tim._. Voir le message
    Je crois comprendre votre réponse, problème, je na sais absolument pas comment faire ça
    Si vous avez écrit la première fonction (decoupechaine), il n'y a pas de bonne raison pour que decoupeChaineFin soit très différente...

    Donc si vous n'inversez pas la chaine de caractère dans la première fonction, pourquoi est ce que cela vous semble nécessaire dans la seconde?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Par défaut
    Il me semble nécessaire de l'inverser dans la seconde fonction car il est écrit dans mon énoncé que je dois parcourir ma chaine de caractère a l'envers. Or je n'ai pas appris a le faire autrement qu'en inversant la fonction... (Si il y a un autre moyen je veut bien le connaitre même si je ne pourrais pas l'utiliser ^^ )

    Ma questions est donc :
    -Pourquoi le programme ne me retourne t'il rien et comment corriger cette erreur ?

    Désolé de ne pas avoir été clair

  6. #6
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Ton souci provient de la variable tailleReverse ligne 24 qui vaut zero lorsqu'elle est définie en ligne 12...
    Remplace la ligne 24 par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in range( len(motRep) -1 , -1 , -1) :
    et ton code fonctionnera...

    Pour illustrer une autre approche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import re
    def decoupe_par_la_fin(mot):
        match = re.sub(r"(.{4})",r"\1 ",mot[::-1])
        return match[::-1]

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Tim._. Voir le message
    Il me semble nécessaire de l'inverser dans la seconde fonction car il est écrit dans mon énoncé que je dois parcourir ma chaine de caractère a l'envers.
    Ce n'est pas réellement ce qui est écrit. Il faut que le découpage commence par la fin, oui, mais ça ne veut pas forcément nécessaire d'inverser la string
    Si je dois découper "123456789" du début, je découpe "12345678" puis je rajoute "9" à la fin. Si je le dois découper de la fin, alors je découpe "23456789" et je rajoute "1" au début. Bref on commence par récupérer juste la plus grande string de taille "*4" soit en partant du début et en s'arrêtant r caractères avant la fin, soit en partant de "r" et en allant jusqu'à la fin ("r" étant le reste de la division par 4). Et dans tous les cas j'ai inversé que dalle.

    Donc si r=len(mot) % 4, alors dans le cas "un" reste=mot[-r:]; mot=mot[:-r] ; et dans le cas "deux" reste=mot[:r]; mot=mot[r:].
    Ne reste qu'à découper "mot" qui est maintenant pile poil à la bonne taille, et ensuite rajouter "reste" soit au début, soit à la fin.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu dis que ta première fonction est résolue, donc ta deuxième fonction devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def decoupeChaineFin(mot):
        r = decoupeChaineDebut("".join(reversed(mot))
        return "".join(reversed(r))
    Si ta première fonction s'appelle decoupeChaineDebut.

    Ainsi tu montreras que tu respectes le principe DRY (Don't Repeate Yourself)

  9. #9
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Par défaut
    Merci a tous pour vos réponses ^^ Mon problème est réglé ! Et merci pour les connaissances même si j'ai un peu de mal avec certain codes que vous m'avez partagé

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 723
    Par défaut
    Salut,

    Citation Envoyé par Tim._. Voir le message
    Il me semble nécessaire de l'inverser dans la seconde fonction car il est écrit dans mon énoncé que je dois parcourir ma chaine de caractère a l'envers. Or je n'ai pas appris a le faire autrement qu'en inversant la fonction...
    Dans votre code, il y a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #Premier Reverse
        for i in range( taille -1 , -1 , -1) :
            listReverse . append( mot [ i ])
    donc vous savez parcourir une chaine de caractères "à l'envers" sans "inverser"...

    Si vous savez écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> s = '12345678**'
    >>> r = ''
    >>> for i in range(len(s)):
    ...     if i % 4 == 0 and r:
    ...         r += ' '
    ...     r += s[i]
    ...
    >>> r
    '1234 5678 **'
    >>>
    faire la même chose en parcourant s par index décroissant y ressemble:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> s = '**12345678'
    >>> r = ''
    >>> u = len(s) % 4
    >>> for i in range(len(s)-1, -1, -1):
    ...     r = s[i] + r
    ...     if (i + u)% 4 == 0:
    ...         r = ' ' + r
    ...
    >>> r
    '** 1234 5678'
    >>>
    Utiliser des fonctionnalités un peu plus évoluées de Python, optimiser le code,... mais on doit retrouver un air de déjà vu avec de petites variations dans les 2 codes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Espace dans une chaîne de caractères
    Par Dan25 dans le forum VBScript
    Réponses: 2
    Dernier message: 25/02/2011, 19h30
  2. [WebI XiR2] Suppression d'un espace dans une chaîne de caractères
    Par SGA99 dans le forum Débuter
    Réponses: 6
    Dernier message: 02/12/2010, 17h12
  3. Supprimer les espaces dans une chaîne de caractère
    Par Med_be dans le forum Débuter
    Réponses: 7
    Dernier message: 15/11/2010, 03h17
  4. Réponses: 16
    Dernier message: 19/11/2008, 12h02
  5. Effacer les espaces dans une chaîne de caractères
    Par JohnnyWalk dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 19/07/2007, 14h13

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