Supprimer le retour à la ligne de fin des éléments d'une liste de chaînes

123

Je dois prendre une grande liste de mots sous la forme:

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

puis en utilisant la fonction de bande, transformez-le en:

['this', 'is', 'a', 'list', 'of', 'words']

Je pensais que ce que j'avais écrit fonctionnerait, mais je reçois toujours une erreur disant:

"L'objet 'list' n'a pas d'attribut 'strip'"

Voici le code que j'ai essayé:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())
George Burrows
la source
1
Veuillez expliquer pourquoi vous ajoutez de 0 à strip_list19 fois, puis vos lignes supprimées. Ce code a une très mauvaise odeur. De plus, si vous avez obtenu ce contenu à partir d'un fichier, vous devriez le supprimer en cours de route - créer une grande liste, puis le dénigrer dans une autre grande liste n'est pas une bonne idée. Aussi 2, votre code ne devrait pas dépendre de la connaissance de la longueur du mot / ligne le plus long. Reculez un peu - qu'essayez-vous de réaliser? Que ferez-vous avec strip_list?
John Machin

Réponses:

212
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> map(str.strip, my_list)
['this', 'is', 'a', 'list', 'of', 'words']
Sven Marnach
la source
puis-je simplement dire stripped_list = map (str.strip, my_list) puis imprimer stripped_list pour imprimer cette nouvelle liste?
George Burrows
19
Si vous utilisez Python 2, notez cependant que cela str.stripne fonctionne que si vous êtes sûr que la liste ne contient pas de chaînes Unicode. S'il peut contenir à la fois des chaînes 8 bits et unicode, utilisez lambda s: s.strip()comme mentionné ci-dessus ou utilisez la stripfonction que vous pouvez importer à partir du stringsmodule.
Cito
Le commentaire Cito est en fait celui qui mérite le plus de représentants. la carte et les listes de compréhension ne sont pas équivalentes en POO, car nous sommes des méthodes de passe, pas des fonctions.
e-satis
fonction de carte intégrée dans le samaritain
SIslam
39
Tenez compte de ce qui suit: Si vous utilisez Python 3.x et que vous souhaitez renvoyer une liste, vous devez le faire listpour qu'elle soit list(map(str.strip, my_list)). Vérifiez également cela: lien .
So S
119

compréhension de la liste? [x.strip() for x in lst]

yosukesabai
la source
65

Vous pouvez utiliser des listes de compréhension :

strip_list = [item.strip() for item in lines]

Ou la mapfonction:

# with a lambda
strip_list = map(lambda it: it.strip(), lines)

# without a lambda
strip_list = map(str.strip, lines)
Schnouki
la source
3
Le lambda dans la deuxième version est exagéré.
gddc
1
Vous pouvez également utiliser la même approche pour faire tout ce qui est avec les 0valeurs au début de la liste. Bien que je ne puisse pas vraiment imaginer ce que vous essayez d'accomplir en les mettant dans la même liste de résultats ...
Karl Knechtel
4
Dans Python 3, la 3ème forme "sans lambda" devrait être strip_list = list(map(str.strip, lines))comme map () renvoie un itérateur de carte. docs.python.org/3/library/functions.html#map
Devy
7

Cela peut être fait en utilisant des compréhensions de liste telles que définies dans PEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]
Casey
la source
Je pensais changer le nom de listen map:)
Casey
3

Toutes les autres réponses, et principalement sur la compréhension des listes, sont excellentes. Mais juste pour expliquer votre erreur:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

aest un membre de votre liste, pas un index. Voici ce que vous pourriez écrire:

[...]
for a in lines:
    strip_list.append(a.strip())

Autre commentaire important: vous pouvez créer une liste vide de cette façon:

strip_list = [0] * 20

Mais ce n'est pas si utile, car .append ajoute des éléments à votre liste. Dans votre cas, il n'est pas utile de créer une liste avec des valeurs par défaut, car vous la construirez élément par élément lors de l'ajout de chaînes supprimées.

Donc, votre code devrait être comme:

strip_list = []
for a in lines:
    strip_list.append(a.strip())

Mais, bien sûr, le meilleur est celui-ci, car c'est exactement la même chose:

stripped = [line.strip() for line in lines]

Au cas où vous auriez quelque chose de plus compliqué qu'un simple .strip, mettez-le dans une fonction et faites de même. C'est la manière la plus lisible de travailler avec des listes.

Joël
la source
2

Si vous devez supprimer uniquement les espaces blancs de fin , vous pouvez utiliser str.rstrip(), ce qui devrait être légèrement plus efficace que str.strip():

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']
Eugène Yarmash
la source
-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Production:

['this', 'is', 'a', 'list', 'of', 'words']
Vignesh Kini K
la source
même que d'autres réponses plus anciennes
Jean-François Fabre