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 :

programme méthode split


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 21
    Par défaut programme méthode split
    Bonjour, j'aimerais obtenir de l'aide pour modifier un programme afin de ne pas utiliser la méthode split. Le but est d'échanger les mots 2 à 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def changmot(phrase):
        s=phrase.split()
        if len(s)==1:
            return(phrase)
        elif len(s)%2==0:
            for c in range(0,len(s),2):
                s[c],s[c+1]=s[c+1],s[c]
            return" ".join(s)
        else:
            for c in range(0,len(s)-1,2):
                s[c],s[c+1]=s[c+1],s[c]
            return" ".join(s)
    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je ne comprends pas bien le but de la question. Parce que si on ne peut pas utiliser la function split prédéfinie, on est pratiquement obligé de réécrire une function split, et on ne gagne rien.

    Par ailleurs, je crois qu'on peut écrire la fonction plus simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def changmot(phrase):
        s= phrase.split()
        for c in range(0, len(s) - 1, 2):
            s[c], s[c+1]= s[c+1], s[c]
        return " ".join(s)
    Dernière modification par Invité ; 27/12/2013 à 23h47.

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Moi non plus, je ne vois rien de plus élégant que le code proposé par YvDao.

    S'il fallait absolument remplacer la méthode split, ce serait possible, mais ça conduit à une grosse fonction. Par exemple:

    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
    def split2(ch):
        liste = []
        i1, i2, lg = 0, 0, len(ch)
        whitespace = [' ', '\x09', '\x0A', '\x0D', '\x0C', '\x0B']
        # recherche du 1er caractère non-whitespace
        while i2<len(ch) and ch[i2] in whitespace:
            i2 += 1
        i1 = i2
        # recherche des mots
        while True:
              while i2<lg and ch[i2] not in whitespace:
                    i2 += 1
              liste.append(ch[i1:i2])
              i1 = i2
              if i2>=lg:
                 break # fin de la chaine
              # neutralisation d'une suite de caractères whitespace
              while i2<lg and ch[i2] in whitespace:
                    i2 += 1
              i1 = i2
              if i2>=lg:
                 break # fin de la chaine
        return liste
    Exemple d'utilisation et comparaison pour vérifier avec la méthode split:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch = "   Que j'aime à faire \r\n apprendre    un nombre utile aux     sages   "
    print split2(ch)
    print ch.split()
    Affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ['Que', "j'aime", 'à', 'faire', 'apprendre', 'un', 'nombre', 'utile', 'aux', 'sages']
    ['Que', "j'aime", 'à', 'faire', 'apprendre', 'un', 'nombre', 'utile', 'aux', 'sages']

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 21
    Par défaut
    Merci pour vos réponses, la méthode de YvDao est en effet bien plus simple.
    En fait le but n'est pas à proprement parler de refaire une fonction split, mais de faire une fonction qui m'amène au même résultat (changer les mots 2 à 2) sans utiliser "split". Apparemment c'est faisable sans trop de difficultés mais je ne vois pas comment. Il y a peut être un moyen de contourner la méthode split en s'y prenant différemment.
    Si vous avez des idées je suis preneuse.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Il n'y a pas moyen de permuter les mots sans les délimiter et pour cela il faut chercher les blancs séparateurs. C'est ce que fait split. C'est incontournable.

    Il y a moyen de construire la chaîne résultat sans passer par une liste de chaînes (via split et join), mais ce serait bien de préciser si c'est cela que tu veux éviter.

    Peut-on savoir d'où provient cette contrainte ?

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Même question que YvDao.

    A la rigueur, en utilisant une partie de mon code ci-dessus, on peut faire que la fonction renvoie les mots un par un (avec yield), ce que split ne sait pas faire:

    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
    31
    32
    33
    34
    35
    def split2(ch):
        i1, i2, lg = 0, 0, len(ch)
        whitespace = [' ', '\x09', '\x0A', '\x0D', '\x0C', '\x0B']
        # recherche du 1er caractère non-whitespace
        while i2<len(ch) and ch[i2] in whitespace:
            i2 += 1
        i1 = i2
        # recherche des mots
        while True:
              while i2<lg and ch[i2] not in whitespace:
                    i2 += 1
              yield ch[i1:i2]
              i1 = i2
              if i2>=lg:
                 break # fin de la chaine
              # neutralisation d'une suite de caractères whitespace
              while i2<lg and ch[i2] in whitespace:
                    i2 += 1
              i1 = i2
              if i2>=lg:
                 break # fin de la chaine
     
    ch = u"Que j'aime à faire \r\n apprendre    un nombre utile aux     sages"
    for mot in split2(ch):
        print mot
    Que
    j'aime
    à
    faire
    apprendre
    un
    nombre
    utile
    aux
    sages
    [Edit] Ci-dessous version simplifiée de la fonction:

    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
    def split2(ch):
        i1, i2, lg = 0, 0, len(ch)
        whitespace = [' ', '\x09', '\x0A', '\x0D', '\x0C', '\x0B']
        # recherche des mots
        while True:
              # neutralisation des caractères whitespace
              while i2<lg and ch[i2] in whitespace:
                    i2 += 1
              if i2>=lg:
                 break # fin de la chaine
              i1 = i2
              # recherche du mot
              while i2<lg and ch[i2] not in whitespace:
                    i2 += 1
              yield ch[i1:i2] # renvoi du mot trouvé
              if i2>=lg:
                 break # fin de la chaine
              i1 = i2

Discussions similaires

  1. La méthode split
    Par JeuneJavaiste dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2009, 14h29
  2. Réponses: 4
    Dernier message: 10/04/2007, 16h26
  3. [C#2.0] méthode split avec séparateur de plusieurs caratères
    Par CUCARACHA dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/02/2007, 18h11
  4. Méthode Split
    Par Dlyan dans le forum MFC
    Réponses: 5
    Dernier message: 27/03/2006, 16h55
  5. Au sujet de la méthode split
    Par sylviefrfr dans le forum Langage
    Réponses: 6
    Dernier message: 17/11/2005, 13h24

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