Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insérer des espaces dans une chaîne de caractères

Sujet résolu
    24 août 2019 à 16:36:37

    Bonjour, pour un projet d'informatique j'aimerais savoir comment insérer des espaces dans une chaîne de caractères à des indices donnés et pas tous les k indices.

    Par exemple j'ai un texte: text="inserez un texte''  et une fonction me donne les emplacements des espaces dans une liste en plus de 0(l'indice de départ) et l'indice du dernier caractère à savoir ici:[0,7,10,15]

    De plus j'ai un autre texte composé du même mot par exemple ''thethethethethe...'' et j'aimerais y insérer des espaces de façon à ce que j'obtienne ''thethet he theth'' c'est à dire le même nombre de lettres que text avec le même emplacement d'espaces en suivant la succession du mot répété.

    Merci de votre aide.:)

    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2019 à 17:17:50

      je sais pas si c'est optimal mais j'aurais tendance à faire comme suit
      >>> a = 'abcde'
      >>> a[:2] + " " + a[2:]
      'ab cde'
      >>> 
      
      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2019 à 17:32:45

        Merci pour votre réponse.

        En effet j'ai essayé d'opter pour cette solution mais je l'ai mise dans une boucle for car il serait beaucoup trop long d'écrire a[:2]+' '+a[2:5]+........ si le texte contient une multitude d'espaces.

        def insertion_esp(cle):

        long = len(chaine_cle(cle))

        c = emplacement_espace_texte()[1] # c est le nombre d'espaces dans text

        chaine = chaine_cle(cle)[:long-c]

        p = emplacement_espace_texte()[0]

        w = len(p)

        liste = []

        for m in range (0,w-1):

             liste.append(chaine[p[m]:p[m+1]])

        return liste,emplacement_espace_texte()[0],chaine

        La fonction me renvoie à la fin ceci : (['thethet', 'het', 'heth'], [0, 7, 10, 15], 'thethethetheth').

        Il y a donc un décalage car je voudrais que 'het' soit 'he' pour correspondre avec 'un' et que 'heth' soit 'theth' pour correspondre avec 'texte'.

        Mais je ne comprends pas pourquoi il y a ce décalage.

        -
        Edité par sto47 24 août 2019 à 17:35:19

        • Partager sur Facebook
        • Partager sur Twitter
          25 août 2019 à 0:24:21

          met ton code dans les balises avec le symbole </>, j'ai pas regardé ce que tu as fait mais souvent le problème viens du fait que rajouter des éléments au milieu décale les indices suivant. Il suffit de faire commencer par la fin pour ne pas bouger tout les indices:

          def insert_spaces(text, pos):
              liste_temp = list(text)
              for x in reversed(sorted(pos)):
                  liste_temp.insert(x, ' ')
              return ''.join(liste_temp)
          
          insert_spaces('abcdefghij', [1,5,3])
          


          (si tu veux encore plus de performance et que tu es sur que les indices sont déjà dans l'ordre retire le sorted ligne 3)

          -
          Edité par Coliculus 25 août 2019 à 9:32:07

          • Partager sur Facebook
          • Partager sur Twitter
            25 août 2019 à 7:22:22

            Bonjour,

            Les insertions, c'est pas top niveau performance. Mieux vaut recréer une nouvelle chaine à partir d'une seule liste. Aussi, je pense que tu te compliques la vie avec ta liste d'indice.

            Voici comment je ferais pour obtenir le résultat final directement

            def coder(texte, mot_a_repeter):
                n = len(mot_a_repeter)
                # Liste des lettres du résultat
                liste = []
                # index de la lettre a ajouter
                i  = 0
                for c in texte:
                    if c == ' ':
                        liste.append(' ')
                    else:
                        liste.append(mot_a_repeter[i])
                        i = (i + 1) % n
                return ''.join(liste)



            • Partager sur Facebook
            • Partager sur Twitter
              25 août 2019 à 9:30:37

              Euh t'es sûr de faire ce qu'il veut obtenir ? sa question c'est comment on ajoute des espaces a des indices précis pas comment multiplier les mots sinon il aurait suffit de faire ca:

              text = 'the'
              n = 9
              new_text = (f'{text} '*n)[:-1]



              -
              Edité par Coliculus 25 août 2019 à 9:30:50

              • Partager sur Facebook
              • Partager sur Twitter
                25 août 2019 à 12:40:10

                Ce n'est pas ce que fait mon code. Avec l'exemple qu'il présente au début, on obtient bien le résultat souhaité.

                In [1]: coder('insérer un texte', 'the')
                Out[1]: 'thethet he theth'



                • Partager sur Facebook
                • Partager sur Twitter
                  25 août 2019 à 15:29:05

                  Merci pour vos réponses. J'ai opté pour recréer une nouvelle chaîne de caractère à partir d'une seule liste. 😊
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 août 2019 à 21:10:29

                    Concaténation de chaînes + enumerate, ça ne suffit pas ?

                    C'est ce qui me semble le plus intuitif...

                    In [1]: def coder(t1, t2): 
                        ...:     indices_space = [0] + [ind for ind, _ in enumerate(t1) if t1[ind] == ' '] + [len(t2)-1] 
                        ...:     result = '' 
                        ...:     for ind, c in enumerate(t2): 
                        ...:         if ind in indices_space: 
                        ...:             result += ' ' 
                        ...:         result += c 
                        ...:     return result 
                        ...:                                                                                                 
                    
                    In [2]: text = "inserez un texte"                                                                             
                    In [3]: coder(text, 'thethethethethe')
                    Out[3]: 'thethet he theth'

                    -
                    Edité par fred1599 25 août 2019 à 22:14:54

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                      25 août 2019 à 23:04:10

                      Salut,

                      C'est un petit exercise marrant. :) Peut-être que j'ai mal compris le résultat attendu. Cependant si il faut prendre la chaîne de caractères thethethethethe et insérer des espaces aux mêmes endroits que dans une chaîne de caractère de départ, je ne partirais pas avec une fonction qui donne les indices des espaces.

                      Il me semble plus approprié de connaître la taille des mots entre chaque espace, et de prendre le même nombre de caractère de thethethethe et de joindre le tout avec des espaces.

                      Ma version serait

                      from itertools import islice
                      
                      def insert_spaces(in_string, repeated_word):
                          words_length = (len(word) for word in in_string.split(" "))
                          # Get an iterator over the repeated_word
                          it = iter(repeated_word)
                          # Take `word_length` chars of repeated_word and join them with a space
                          result = " ".join("".join(islice(it, word_length)) for word_length in words_length)
                          return result



                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 août 2019 à 23:06:50

                        Ca dépend de la façon de voir les choses.


                        S'il s'agit d'insérer des espaces dans une chaine, la concaténation est peut-être plus "intuitive".
                        Mais ça suppose de procéder en 3 étapes.
                        1) récupérer la position des espaces
                        2) créer la chaine avec les mots à répéter, sans espaces
                        3) insérer les espaces aux bons endroits
                        Vu comme ça, ça ne me semble plus si intuitif que ça.
                        De plus, les concaténations peuvent être assez gourmandes en mémoire/temps de calcul.
                        A moins qu'on soit sûr de travailler sur des "petites" chaines, mieux vaut les éviter.

                        J'ai donc pris le problème dans sa globalité.
                        On regarde les caractères un par un.
                        Si c'est un espace, on le conserve, si c'est autre chose, on le remplace par un caractère du mot à répéter.
                        C'est simple, efficace et (pour moi, en tout cas) ça me semble particulièrement intuitif.

                        Après, chacun raisonne différemment. Donc ce qui est intuitif peut être différent pour chacun.
                        Par contre, niveau efficacité, la différence est indéniable.
                        Si c'est pour de petites chaines (quelques dizaines de caractères), la concaténation peut suffire.
                        Pour des chaines plus longues, ça risque de ramer ou de gaspiller des ressources inutilement.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 novembre 2022 à 14:30:42

                          text = 'iuhhhoihpjpiijp'
                          nb = 9
                          texte2 = (f'{text} '*nb)[:-1]

                          -
                          Edité par nouraziza 6 novembre 2022 à 14:33:22

                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 novembre 2022 à 11:26:32

                            euh c'est l'un des codes donnés en réponse et qui ne répond (toujours) pas à la demande; mauvais déterrage .. (et inutile de passer par un f-string)

                            -
                            Edité par umfred 7 novembre 2022 à 11:26:47

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 février 2023 à 14:01:59

                              text='gduhsdgsdghsdghsdfghsfgh'

                              nb=9

                              texte2=(f'{text}'*nb[:-1]

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Insérer des espaces dans une chaîne de caractères

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown