Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pas de methode insertAt pour les chaines ?

7 réponses
Avatar
Tool69
Salut,

voil=E0, j'ai besoin d'ins=E9rer une chaine dans une autre =E0 une position
donn=E9e,
je suis =E9tonn=E9 de ne pas trouver cela dans le module string, j'ai donc
=E9cris une
fonction comme ci-dessous en utilisant les slices (serait-ce mieux
avec des listes ?),
mais pouvez-vous me confirmer qu'il n'existe pas de telle fonction 'de
base' ?

def insert(original, inserted, pos):
'''Insert inserted in original at the given pos

If pos > len(original), complete original string
whith whitespaces.
'''
diff =3D pos - len(original)
if diff > 0 : # on doit placer des espaces
original +=3D " "*(diff)
return original[:pos] + inserted + original[pos:]

Merci, a plus :
Kib=B2

7 réponses

Avatar
Laurent Pointal
Salut,

voilà, j'ai besoin d'insérer une chaine dans une autre à une position
donnée,
je suis étonné de ne pas trouver cela dans le module string, j'ai donc
écris une
fonction comme ci-dessous en utilisant les slices (serait-ce mieux
avec des listes ?),
mais pouvez-vous me confirmer qu'il n'existe pas de telle fonction 'de
base' ?

def insert(original, inserted, pos):
'''Insert inserted in original at the given pos

If pos > len(original), complete original string
whith whitespaces.
'''
diff = pos - len(original)
if diff > 0 : # on doit placer des espaces
original += " "*(diff)
return original[:pos] + inserted + original[pos:]

Merci, a plus :
Kib²



Il n'existe aucune fonction/méthode de base pour modifier une chaîne.
Elles sont "immutables", une fois créées on ne peut pas les modifier sur
place.

Donc, ta façon de faire est la bonne.

Pour info:
http://www.python.org/doc/faq/general/#why-are-python-strings-immutable

Avatar
Tool69
On 4 avr, 11:52, Laurent Pointal wrote:



Salut,

voilà, j'ai besoin d'insérer une chaine dans une autre à une posi tion
donnée,
je suis étonné de ne pas trouver cela dans le module string, j'ai d onc
écris une
fonction comme ci-dessous en utilisant les slices (serait-ce mieux
avec des listes ?),
mais pouvez-vous me confirmer qu'il n'existe pas de telle fonction 'de
base' ?

def insert(original, inserted, pos):
'''Insert inserted in original at the given pos

If pos > len(original), complete original string
whith whitespaces.
'''
diff = pos - len(original)
if diff > 0 : # on doit placer des espaces
original += " "*(diff)
return original[:pos] + inserted + original[pos:]

Merci, a plus :
Kib²


Il n'existe aucune fonction/méthode de base pour modifier une chaîne.
Elles sont "immutables", une fois créées on ne peut pas les modifier sur
place.

Donc, ta façon de faire est la bonne.

Pour info:http://www.python.org/doc/faq/general/#why-are-python-strings-i mmutable


Merci Laurent,

je savais que les chaîne étaient immutables, donc qu'on ne peut pas
les modifier sans créer une nouvelle instance.
Cependant j'esperai qu'une telle fonction soit déjà présente quelque
part dans un module.

A bientôt,
Kib²


Avatar
MC
Bonjour !

Tu peux faire l'économie du test :

def insert2(original, inserted, pos):
original += " "*(pos - len(original))
return original[:pos] + inserted + original[pos:]







--
@-salutations

Michel Claveau
Avatar
MC
Et, comme l'ajout d'espaces n'a lieu qu'au début :

def insert3(original, inserted, pos):
return(original+"
"*(pos-len(original)))[:pos]+inserted+original[pos:]






--
@-salutations

Michel Claveau
Avatar
Maric Michaud
Tool69 wrote:

voilà, j'ai besoin d'insérer une chaine dans une autre à une position
donnée,


On insère pas de chaînes en python, on en produit de nouvelles.

je suis étonné de ne pas trouver cela dans le module string, j'ai donc
écris une


Le module string ne doit pas être utilisé, les méthodes du type str sont
plus optimisées.

fonction comme ci-dessous en utilisant les slices (serait-ce mieux
avec des listes ?),
mais pouvez-vous me confirmer qu'il n'existe pas de telle fonction 'de
base' ?



Non cela n'existe pas, mais c'est une opération de formatage de chaîne assez
élémentaire, on pourrait écrire cette fonction de la façon suivante (c'est
pas forcément plus clair, mais c'est juste pour dire qu'on peut le faire en
une seule expression) :

insertat = lambda s1, s2, pos : ("%-" + str(pos) + "s%s%s") %(s1[:pos],
s2, s1[pos:])



insertat("toto", "12", 0)
'12toto'



insertat("toto", "12", 2)
'to12to'



insertat("toto", "12", 4)
'toto12'



insertat("toto", "12", 5)
'toto 12'



insertat("toto", "12", 10)
'toto 12'





--
Maric Michaud
_____________



Avatar
MC
Bonjour !

Je ne voudrais l'air de critiquer, mais, dans le'exemple cité, je ne
vois pas bien l'intérêt de la lambda, relativement à ça :

def insertat(s1,s2,pos): return("%-" + str(pos) + "s%s%s") %(s1[:pos],
s2, s1[pos:])

insertat("toto", "12", 0)
...








--
@-salutations

Michel Claveau
Avatar
Maric Michaud
MC wrote:

Bonjour !


Bonjour,

Je ne voudrais l'air de critiquer, mais, dans le'exemple cité, je ne
vois pas bien l'intérêt de la lambda, relativement à ça :

def insertat(s1,s2,pos): return("%-" + str(pos) + "s%s%s") %(s1[:pos],
s2, s1[pos:])

insertat("toto", "12", 0)


Il n'y en a pas, c'est juste pour dire que ça se fait en une seule
expression, et donc, qu'à la limite il n'y a pas vraiment besoin de
fonction non plus (à moins de le faire vraiment très souvent, ce dont je
doute un peu).


--
Maric Michaud - www.aristote.info