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é.
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.
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)
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)
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:
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
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)
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
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.
× 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.
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)