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

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

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']

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


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)

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']]

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.


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']

-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']

tak samo jak inne starsze odpowiedzi
Jean-François Fabre
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.