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.