Usuń końcowy znak nowej linii z elementów listy ciągów

123

Muszę wziąć dużą listę słów w postaci:

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

a następnie używając funkcji strip, zamień ją na:

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

Myślałem, że to, co napisałem, zadziała, ale ciągle pojawia się błąd:

Obiekt „lista” nie ma atrybutu „pasek” ”

Oto kod, który wypróbowałem:

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
źródło
1
Wyjaśnij, dlaczego dodajesz od 0 do strip_list19 razy, a następnie dołączasz pozbawione linie. Ten kod ma bardzo nieprzyjemny zapach. Również jeśli masz te rzeczy z pliku, powinieneś je rozbierać po drodze - budowanie dużej listy, a następnie wbijanie jej w inną dużą listę nie jest dobrym pomysłem. Również 2, twój kod nie powinien zależeć od znajomości długości najdłuższego słowa / linii. Cofnij się trochę - co próbujesz osiągnąć? Co zrobisz strip_list?
John Machin
Powiązane Jak usunąć \ nz elementu listy?
Bhargav Rao

Odpowiedzi:

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
źródło
czy mógłbym wtedy po prostu powiedzieć stripped_list = map (str.strip, my_list), a następnie wydrukować stripped_list, aby wydrukować tę nową listę?
George Burrows
19
Jeśli używasz Pythona 2, pamiętaj, że str.stripdziała to tylko wtedy, gdy masz pewność, że lista nie zawiera ciągów znaków Unicode. Jeśli może zawierać zarówno łańcuchy 8-bitowe, jak i Unicode, użyj tego, lambda s: s.strip()jak wspomniano powyżej, lub użyj stripfunkcji, którą możesz zaimportować z stringsmodułu.
Cito,
Komentarz Cito jest właściwie tym, który zasługuje na największe uznanie. mapy i listy interpretacji nie są równoważne w OOP, ponieważ jesteśmy metodami passe, a nie funkcjami.
e-satis
wbudowana funkcja mapy w samarytaninie
SIslam
39
Należy pamiętać o następujących kwestiach: Jeśli używasz Pythona 3.x i chcesz zwrócić listę, musisz listto zrobić list(map(str.strip, my_list)). Sprawdź też: link .
Więc s
120

rozumienie listy? [x.strip() for x in lst]

yosukesabai
źródło
65

Możesz używać list składanych :

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

Lub mapfunkcja:

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

# without a lambda
strip_list = map(str.strip, lines)
Schnouki
źródło
3
Lambda w drugiej wersji to przesada.
gddc
1
Możesz użyć tego samego podejścia, aby zrobić cokolwiek z 0wartościami na początku listy. Chociaż nie mogę sobie wyobrazić, co próbujesz osiągnąć, umieszczając je na tej samej liście wyników ...
Karl Knechtel
4
W Pythonie 3 trzecia forma „bez lambda” powinna wyglądać strip_list = list(map(str.strip, lines))tak, jak map () zwraca iterator mapy. docs.python.org/3/library/functions.html#map
Devy
7

Można to zrobić za pomocą list składanych zgodnie z definicją w PEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]
Casey
źródło
Myślałem o zmianie nazwy z listna map:)
Casey
3

Wszystkie inne odpowiedzi, a głównie dotyczące rozumienia listy, są świetne. Ale żeby wyjaśnić twój błąd:

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

ajest członkiem Twojej listy, a nie indeksem. Możesz napisać tak:

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

Kolejny ważny komentarz: pustą listę możesz stworzyć w ten sposób:

strip_list = [0] * 20

Ale to nie jest tak przydatne, ponieważ .append dodaje rzeczy do listy. W twoim przypadku nie jest użyteczne tworzenie listy z domyślnymi wartościami, ponieważ będziesz budować ją jako element dla każdego elementu podczas dołączania usuniętych ciągów.

Twój kod powinien wyglądać następująco:

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

Ale na pewno najlepszy jest ten, ponieważ to dokładnie to samo:

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

Jeśli masz coś bardziej skomplikowanego niż zwykłe a .strip, umieść to w funkcji i zrób to samo. To najbardziej czytelny sposób pracy z listami.

Joël
źródło
2

Jeśli chcesz usunąć tylko końcowe spacje, możesz użyć str.rstrip(), co powinno być nieco bardziej wydajne niż 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']
Eugene Yarmash
źródło
-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Wynik:

['this', 'is', 'a', 'list', 'of', 'words']
Vignesh Kini K.
źródło
tak samo jak inne starsze odpowiedzi
Jean-François Fabre