1
votes

Comment appliquer une transformation ljust () à chaque élément d'une liste de chaînes?

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.


4 commentaires

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 *?


3 Réponses :


0
votes

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))


0 commentaires

3
votes

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())


0 commentaires

2
votes

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!!!


0 commentaires