J'apprends Python et j'essaye d'ajouter 2 ** devant chaque ligne d'un exemple de texte. Cependant, lorsque j'appelle ljust (2, '*') sur chaque élément, cela ne change pas la chaîne d'origine. Je veux remplacer le nouvel élément par cette ancienne chaîne mais comment?
C'est ce que j'ai essayé. J'ai d'abord essayé avec une boucle for régulière mais cela n'a pas fonctionné. Puis je suis tombé sur une question où les compréhensions de liste sont expliquées Effectuer une opération de chaîne pour chaque élément dans une liste Python donc j'ai essayé cela.
Voici ce que j'ai maintenant
example_string = '''hello there how are you doing!
i am doig well thank you
lets get to work!!! '''
def modify_example_string():
global example_string
new_string_list = [element.ljust(2,'*') for element in example_string.split('\n')]
example_string = '\n'.join(new_string_list)
print(new_string_list)
modify_example_string()
Ceci devrait renvoyer une nouvelle liste avec toutes les transformations ljust, mais ce n'est pas le cas, alors j'aimerais connaître la bonne façon de résoudre ce problème.
3 Réponses :
Je diviserais votre chaîne en utilisant la méthode splitlines () et utiliserais une boucle for pour parcourir les lignes et créer une nouvelle chaîne concaténée pour la sortie.
Quelque chose comme ceci:
example_string = '''hello there how are you doing!
i am doig well thank you
lets get to work!!! '''
def modify_example_string(input_string):
new_string_list = ''
for line in input_string.splitlines():
new_string_list += f'**{line}\n'
return new_string_list
print(modify_example_string(example_string))
Il semble que vous ayez mal compris ce que ljust (2, '*') fait. Il n'ajoute pas deux * au début de la chaîne mais remplira la chaîne avec * jusqu'à une longueur totale de 2. Toutes vos lignes sont plus longues, donc cela ne fait rien .
À la place, utilisez simplement "**" + ligne pour ajouter les étoiles aux lignes.
def prepend_stars(s):
return "\n".join("**" + line for line in s.splitlines())
example_string = prepend_stars(example_string)
Aussi, au lieu d'utiliser global Je recommande d'utiliser des paramètres et des valeurs de retour:
def modify_example_string():
global example_string
example_string = "\n".join("**" + line for line in example_string.splitlines())
La méthode ljust ne fait pas ce que vous attendez. La documentation dit:
Renvoie la chaîne justifiée à gauche dans une chaîne de longueur largeur. Le remplissage est effectué à l'aide du fillchar spécifié (la valeur par défaut est un espace ASCII). La chaîne d'origine est renvoyée si la largeur est inférieure ou égale à len (s) .
La compréhension de votre liste est correcte.
Une solution pourrait être d'utiliser le format . Un bon tutoriel ici .
Exemple de code au format :
example_string = '''hello there how are you doing!
i am doig well thank you
lets get to work!!! '''
def modify_example_string(example_string, ch, n):
new_string_list = ["{} {}".format(ch * n, element)
for element in example_string.split('\n')]
example_string = '\n'.join(new_string_list)
return example_string
print(modify_example_string(example_string, "*", 2))
# ** hello there how are you doing!
# ** i am doig well thank you
# ** lets get to work!!!
aussi, je voudrais savoir pourquoi la compréhension de liste ne fonctionne pas dans ce cas
ljust (2, "**")passera la chaîne avec*si elle est plus courte que 2, ne pas ajouter**à chaque chaîne .@tobias_k automatetheboringstuff.com/chapter6 >>> 'Hello'.rjust (20,' * ') donne '*************** Bonjour' selon livre
Oui, et avez-vous compté? Sont-ils 20 *?