Remova a nova linha à direita dos elementos de uma lista de cadeias

122

Eu tenho que ter uma grande lista de palavras no formulário:

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

e, em seguida, usando a função strip, transforme-a em:

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

Eu pensei que o que havia escrito funcionaria, mas continuo recebendo um erro dizendo:

"O objeto 'list' não tem atributo 'strip'"

Aqui está o código que eu tentei:

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
fonte
1
Por favor, explique por que você está anexando de 0 a strip_list19 vezes e depois suas linhas despojadas. Esse código tem um cheiro muito ruim. Além disso, se você tiver essas informações em um arquivo, você deve retirá-las no caminho - criar uma lista grande e depois colocá-la em outra lista grande não é uma boa idéia. Além disso, 2, seu código não deve depender de saber o comprimento da palavra / linha mais longa. Recue um pouco - o que você está tentando alcançar? Com o que você fará strip_list?
John Machin

Respostas:

211
>>> 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
fonte
eu poderia apenas dizer stripped_list = map (str.strip, my_list) e depois imprimir stripped_list para imprimir esta nova lista?
George Burrows
19
Se você estiver usando o Python 2, observe que isso str.stripsó funciona se você tiver certeza de que a lista não contém seqüências de caracteres unicode. Se ele puder conter cadeias de caracteres de 8 bits e unicode, use lambda s: s.strip()como mencionado acima ou use a stripfunção que você pode importar do stringsmódulo.
Cito
O comentário Cito é realmente aquele que merece mais rep. listas de mapa e compreensão não são equivalentes no OOP, porque somos métodos de passe, não funções.
E-satis #
construído em função de mapa na samaritano
SIslam
39
Esteja ciente do seguinte: Se você estiver usando o Python 3.xe deseja retornar uma lista, é necessário listque seja list(map(str.strip, my_list)). Verifique também: link .
Então S
118

compreensão da lista? [x.strip() for x in lst]

yosukesabai
fonte
64

Você pode usar a compreensão de listas :

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

Ou a mapfunção:

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

# without a lambda
strip_list = map(str.strip, lines)
Schnouki
fonte
3
O lambda na segunda versão é um exagero.
Gddc
1
Você pode usar a mesma abordagem para fazer o que for com os 0valores no início da lista também. Embora eu realmente não posso imaginar o que é que você está tentando realizar, colocando-os na mesma lista de resultados ...
Karl Knechtel
4
No Python 3, a terceira forma "sem um lambda" deve ser strip_list = list(map(str.strip, lines))como map () retorna um iterador de mapa. docs.python.org/3/library/functions.html#map
Devy
7

Isso pode ser feito usando a compreensão da lista, conforme definido no PEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]
Casey
fonte
Eu estava pensando em mudar o nome a partir listde map:)
Casey
3

Todas as outras respostas, e principalmente sobre compreensão de lista, são ótimas. Mas apenas para explicar o seu erro:

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

aé um membro da sua lista, não um índice. O que você poderia escrever é o seguinte:

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

Outro comentário importante: você pode criar uma lista vazia desta maneira:

strip_list = [0] * 20

Mas isso não é tão útil, pois .append acrescenta coisas à sua lista. No seu caso, não é útil criar uma lista com valores padrão, pois você a criará item por item ao anexar strings removidas.

Portanto, seu código deve ser como:

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

Mas, com certeza, o melhor é esse, pois é exatamente a mesma coisa:

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

Caso você tenha algo mais complicado do que apenas um .strip, coloque isso em uma função e faça o mesmo. Essa é a maneira mais legível de trabalhar com listas.

Joël
fonte
2

Se você precisar remover apenas os espaços em branco à direita , poderá usar o str.rstrip()que deve ser um pouco mais eficiente do 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']
Eugene Yarmash
fonte
-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Resultado:

['this', 'is', 'a', 'list', 'of', 'words']
Vignesh Kini K
fonte
o mesmo que as respostas anteriores
Jean-François Fabre