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 :

decouper une chaine


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Par défaut decouper une chaine
    Bonjour,

    Je souhaites ajouter un caractère (espace) dans une chaine de caractère toutes les 5 lettres !!!!

    Origine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    message="monbutestderajouterunespacedanscettechainetoutelescinqlettres"
    Objectif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    message="monbu testd erajo uteru nespa cedan scett echai netou teles cinql ettres"

    J'ai pensé a mettre le message d'origine dans une liste puis d'ajouter un caractère tout les modulo 5 de la chaine, mais sans succes.

    Merci de votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message = ' '.join(message[i:i+5] for i in range(0,len(message),5))
    Le principe est simple: découper la chaîne en une sous-chaines de 5 caractères (ici à l'aide d'un générateur, tant qu'à faire; on peut aussi utiliser une compréhension de liste) et les recoller ensemble en les séparant par un espace.

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 080
    Par défaut
    Il y a plein de solutions, je propose la mienne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(0, len(message)-1, 5):
    	print message[i:i+5]
    Edit : grilled

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Par défaut
    En fait j'ai un traitement et j'obtiens un résultat sous forme de liste.
    Je me suis mal exprimé, en fait je réitère ma question:

    Comment ajouter un élément tout les 5 élément d'une liste ?

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    La réponse à ta dernière question est
    ' '.join(...)
    Sinon tu peux aussi passer par re ou textwrap comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import re
    re_slice=lambda s: re.findall(r'.{1,5}', s)
     
    import textwrap
    wrap_slice=lambda s: textwrap.wrap(s, 5)
     
    def add_space(msg, method):
        return ' '.join(method(msg))
     
    if __name__ == '__main__':
        message="monbutestderajouterunespacedanscettechainetoutelescinqlettres"
        print add_space(message, re_slice)
        print add_space(message, wrap_slice)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 080
    Par défaut
    Dans cet exemple, j'ajoute "coucou" tout les 5 éléments, mais bon rien à voir avec ta 1ere question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    message=list("monbutestderajouterunespacedanscettechainetoutelescinqlettres")
    for i in range(0, len(message)-1, 5):
    	if i!=0:
    		message[i]="coucou"
    print "".join(message)

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Une méthode bien tordue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> message="monbutestderajouterunespacedanscettechainetoutelescinqlettres"
    >>> l = list(message)
    >>> for i in range(5, len(l)+(len(l)-1)/5, 6):
    ...     l.insert(i, ' ')
    ... 
    >>> print ''.join(l)
    monbu testd erajo uteru nespa cedan scett echai netou teles cinql ettre s
    C'est pour rire mais ça fonctionne

  8. #8
    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
    en fait je réitère ma question:

    Comment ajouter un élément tout les 5 élément d'une liste ?

    Salut,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,17,18,19,20,
          21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]
     
    raj = ('ceruse','pizza','cigare','grognon','Blanche-Neige',
           'droguerie','cypres','chaleur','moustique','griotte')
     
    SL = []
    for i in xrange(0,len(li),5):
        SL.extend( li[i:i+5] + [raj[i/5]] )
     
    print SL

    [1, 2, 3, 4, 5, 'ceruse', 6, 7, 8, 9, 10, 'pizza', 11, 12, 13, 14, 15, 'cigare', 6, 17, 18, 19, 20, 'grognon', 21, 22, 23, 24, 25, 'Blanche-Neige', 26, 27, 28, 29, 30, 'droguerie', 31, 32, 33, 34, 35, 'cypres', 36, 37, 'chaleur']

  9. #9
    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
    La solution du post précédent créait une nouvelle liste.



    Le code suivant modifie en place la liste de départ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    li = [ 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,36,37]
     
    raj = ('ceruse','pizza','cigare','grognon','Blanche-Neige',
           'droguerie','cypres','chaleur','moustique','griotte')
     
    for i in xrange(len(li)-len(li)%5,0,-5):
        li[i:i] = [raj[i/5-1]]

    On est obligé de faire un parcours à rebours des indices, sinon en ajoutant un élément en i=5 on déplace l’élément qui était à la position 5 vers une position 6, ce qui décale ensuite toutes les insertions suivantes.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Salut,

    J'y vais de ma petite version à moi que c'est la mienne :

    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
     
    def insert(iterable, count=5, separator=' '):
        """
        Générateur qui insère 'separator' tous les 'count' éléments de 'iterable'.
     
        Exemples:
        >>> ''.join(insert("monbutestderajouterunespacedanscettechainetoutelescinqlettres"))
        'monbu testd erajo uteru nespa cedan scett echai netou teles cinql ettre s'
        >>> list(insert([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], count=2, separator=[]))
        [1, 2, [], 3, 4, [], 5, 6, [], 7, 8, [], 9, 10, []]
        """
        for i, x in enumerate(iterable):
            yield x
            if (i + 1) % count == 0:
                yield separator
     
    if __name__ == '__main__':
        from doctest import testmod
        testmod(verbose=True)
    Le deuxième exemple montre une éventuelle erreur de cet algo, il faudrait éventuellement rajouter le test i != len(iterable) pour éviter ça.

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Ave Eyquem
    Personnellement, je découperais le problème en deux:
    - assemblage des 5 éléments ou découpage du string,
    - merge des deux listes,
    nous avons donc 2 listes a, b à intercaler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def intercaler(x, y):
        for u,v in izip(x, y):
             yield u
             yield v
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    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 ne connaissais pas textwrap. Merci pour la découverte.



    C’est dommage de rendre moins immédiatement compréhensible les procédés en les paquetant dans des fonctions.

    Finalement il s’agit simplement de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import re
    print ' '.join(re.findall(r'.{1,5}', ch))
     
    import textwrap
    print ' '.join(textwrap.wrap(ch, 5))




    Je propose aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    chh = "monbutestderajouterunespacedanscettechainetoutelescinqlettres"
    print re.sub('(.....)','\\1 ',chh)






    L’utilisation de yield, c’est pas mal, mais je n’aime pas trop l’obligation de faire à chaque fois l’évaluation de (i + 1) % count == 0
    Pourtant enumerate(iterable) peut s’appliquer aussi bien à une chaîne qu’à une liste.









    Pour une chaîne:

    from itertools import izip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def intercaler(x, y):
        for u,v in izip(x, y):
             yield u
             yield v
     
    ch = "monbutestderajouterunespacedanscettechainetoutelescinqlettres"
     
    x = [ ch[i:i+5] for i in xrange(0,len(ch),5) ]
    y = len(x)*' '
     
    print ''.join(list(intercaler(x,y)))
    Ça me paraît inutilement compliqué.



    Pour une liste c’est pire:

    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
     
    from itertools import izip
    def intercaler(x, y):
        for u,v in izip(x, y):
             yield u
             yield v
     
    li = [ 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,36,37]
    raj = [23,45,34,23,45,390,900,902,904,9044,9012,90445,9089,908987,9098]
     
    x = [ li[i:i+5] for i in xrange(0,len(li),5) ] # decoupinge
    y = [ [bl] for bl in raj ] # mergeingue
     
    print sum(intercaler(x,y),[])

  13. #13
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour,
    sympas ces différentes versions, mes préférences allant à celle avec li[i:i] = [raj[i/5-1]] et à celle de nardo47 même s'il y a un petit bug.

    Par contre, il y a une petite erreur dans le tout dernier code : on dit "merginge" et non "mergeinge".

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

Discussions similaires

  1. [Tableaux] decouper une chaine de caractères
    Par pekka77 dans le forum Langage
    Réponses: 12
    Dernier message: 03/12/2005, 19h08
  2. Découper une chaine ....
    Par webspeak dans le forum Linux
    Réponses: 8
    Dernier message: 07/11/2005, 15h12
  3. Réponses: 5
    Dernier message: 03/02/2005, 13h59
  4. decouper une chaine de caractere
    Par tibobao dans le forum ASP
    Réponses: 4
    Dernier message: 06/12/2004, 12h26
  5. langage] Découper une chaine suivant un délimiteur
    Par totox17 dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2002, 16h25

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