Hapus baris baru yang tertinggal dari elemen daftar string

123

Saya harus mengambil banyak daftar kata dalam bentuk:

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

dan kemudian menggunakan fungsi strip, ubah menjadi:

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

Saya pikir apa yang telah saya tulis akan berhasil, tetapi saya terus mendapatkan kesalahan yang mengatakan:

"'list' object tidak memiliki atribut 'strip'"

Berikut kode yang saya coba:

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
sumber
1
Harap jelaskan mengapa Anda menambahkan 0 hingga strip_list19 kali kemudian menambahkan garis yang dilucuti. Kode itu memiliki bau yang sangat buruk tentangnya. Juga jika Anda mendapatkan barang itu dari sebuah file, Anda harus menghapusnya saat masuk - membuat daftar besar kemudian memasukkannya ke dalam daftar besar lainnya bukanlah ide yang baik. Juga 2, kode Anda tidak harus bergantung pada mengetahui panjang kata / baris terpanjang. Mundur sedikit - apa yang ingin Anda capai? Apa yang akan kamu lakukan strip_list?
John Machin

Jawaban:

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
sumber
bisakah saya mengatakan stripped_list = map (str.strip, my_list) dan kemudian mencetak stripped_list untuk mencetak daftar baru ini?
George Burrows
19
Jika Anda menggunakan Python 2, perhatikan, itu str.striphanya berfungsi jika Anda yakin bahwa daftar tersebut tidak berisi string unicode. Jika dapat berisi string 8-bit dan unicode, gunakan lambda s: s.strip()seperti yang disebutkan di atas, atau gunakan stripfungsi yang dapat Anda impor dari stringsmodul.
Cito
Komentar Cito sebenarnya adalah komentar yang paling pantas mendapat reputasi. peta dan daftar pemahaman tidak setara dalam OOP, karena kami adalah metode passe, bukan fungsi.
e-satis
fungsi peta built in di
samaritan
39
Menyadari berikut: Jika Anda menggunakan Python 3.x dan Anda ingin kembali daftar, Anda harus list, sehingga itu list(map(str.strip, my_list)). Juga periksa itu: tautan .
Jadi S
119

pemahaman daftar? [x.strip() for x in lst]

yosukesabai
sumber
65

Anda dapat menggunakan pemahaman daftar :

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

Atau mapfungsinya:

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

# without a lambda
strip_list = map(str.strip, lines)
Schnouki
sumber
3
Lambda di versi kedua terlalu berlebihan.
gddc
1
Anda juga dapat menggunakan pendekatan yang sama untuk melakukan apa pun dengan 0nilai di awal daftar. Meskipun saya tidak dapat membayangkan apa yang Anda coba capai dengan menempatkan mereka dalam daftar hasil yang sama ...
Karl Knechtel
4
Di Python 3, bentuk ketiga "tanpa lambda" harus strip_list = list(map(str.strip, lines))seperti map () mengembalikan iterator peta. docs.python.org/3/library/functions.html#map
Devy
7

Ini dapat dilakukan dengan menggunakan pemahaman daftar seperti yang didefinisikan dalam PEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]
Casey
sumber
Saya berpikir untuk mengubah nama dari listke map:)
Casey
3

Semua jawaban lain, dan terutama tentang pemahaman daftar, bagus. Tetapi hanya untuk menjelaskan kesalahan Anda:

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

aadalah anggota daftar Anda, bukan indeks. Apa yang bisa Anda tulis adalah ini:

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

Komentar penting lainnya: Anda dapat membuat daftar kosong dengan cara ini:

strip_list = [0] * 20

Tapi ini tidak begitu berguna, karena .append menambahkan barang ke daftar Anda. Dalam kasus Anda, tidak berguna untuk membuat daftar dengan nilai defaut, karena Anda akan membuatnya item per item saat menambahkan string yang dilucuti.

Jadi kode Anda harus seperti:

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

Tapi, yang pasti, yang terbaik adalah yang ini, karena ini persis sama:

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

Jika Anda memiliki sesuatu yang lebih rumit dari sekedar a .strip, letakkan ini dalam sebuah fungsi, dan lakukan hal yang sama. Itulah cara yang paling mudah dibaca untuk bekerja dengan daftar.

Joël
sumber
2

Jika Anda perlu untuk menghapus hanya tertinggal spasi, Anda bisa menggunakan str.rstrip(), yang harus sedikit lebih efisien daripada 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
sumber
-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Keluaran:

['this', 'is', 'a', 'list', 'of', 'words']
Vignesh Kini K.
sumber
sama dengan jawaban lama lainnya
Jean-François Fabre