Xóa dòng mới ở cuối khỏi các phần tử của danh sách chuỗi


123

Tôi phải lấy một danh sách lớn các từ trong biểu mẫu:

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

và sau đó sử dụng hàm dải, biến nó thành:

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

Tôi nghĩ rằng những gì tôi đã viết sẽ hoạt động, nhưng tôi tiếp tục nhận được lỗi nói:

Đối tượng "danh sách" không có thuộc tính 'dải' "

Đây là mã mà tôi đã thử:

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
Vui lòng giải thích lý do tại sao bạn nối từ 0 đến strip_list19 lần sau đó nối các dòng bị tước của bạn. Mã đó có mùi rất khó chịu. Ngoài ra, nếu bạn lấy những thứ đó từ một tệp, bạn nên tách nó ra trong quá trình vào - xây dựng một danh sách lớn sau đó đưa nó vào một danh sách lớn khác không phải là một ý kiến ​​hay. Ngoài ra, mã của bạn không nên phụ thuộc vào việc biết độ dài của từ / dòng dài nhất. Lùi lại một chút - bạn đang cố gắng đạt được điều gì? Bạn sẽ làm gì với strip_list?
John Machin

Câu trả lời:


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

sau đó tôi có thể chỉ nói stri_list = map (str.strip, my_list) và sau đó in stripe_list để in danh sách mới này không?
George Burrows

19
Tuy nhiên, nếu bạn đang sử dụng Python 2, hãy lưu ý rằng điều đó str.stripchỉ hoạt động nếu bạn chắc chắn rằng danh sách không chứa chuỗi unicode. Nếu nó có thể chứa cả chuỗi 8 bit và unicode, hãy sử dụng lambda s: s.strip()như đã đề cập ở trên hoặc sử dụng striphàm mà bạn có thể nhập từ stringsmô-đun.
Cito

Bình luận của Cito thực sự là bình luận xứng đáng nhất. bản đồ và danh sách hiểu không tương đương trong OOP, bởi vì chúng tôi là phương thức truyền, không phải hàm.
e-thoả mãn

được xây dựng trong chức năng bản đồ trong
samaritan

39
Hãy lưu ý những điều sau: Nếu bạn đang sử dụng Python 3.x và bạn muốn trả về một danh sách, bạn phải làm listnhư vậy list(map(str.strip, my_list)). Cũng kiểm tra xem: liên kết .
So S


65

Bạn có thể sử dụng cách hiểu danh sách :

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

Hoặc mapchức năng:

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

# without a lambda
strip_list = map(str.strip, lines)

3
Lambda trong phiên bản thứ hai là quá mức cần thiết.
gddc

1
Bạn cũng có thể sử dụng cách tiếp cận tương tự để làm bất cứ điều gì với các 0giá trị ở đầu danh sách. Mặc dù tôi thực sự không thể tưởng tượng được những gì bạn đang cố gắng hoàn thành bằng cách đưa chúng vào cùng một danh sách kết quả ...
Karl Knechtel

4
Trong Python 3, dạng thứ 3 "không có lambda" phải strip_list = list(map(str.strip, lines))là map () trả về một trình lặp bản đồ. docs.python.org/3/library/functions.html#map
Devy

7

Điều này có thể được thực hiện bằng cách sử dụng toàn bộ danh sách như được định nghĩa trong PEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]

Tôi đã nghĩ đến việc đổi tên từ listthành map:)
Casey

3

Tất cả các câu trả lời khác, và chủ yếu là về khả năng hiểu danh sách, đều rất tuyệt. Nhưng chỉ để giải thích lỗi của bạn:

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

alà một thành viên trong danh sách của bạn, không phải là một chỉ mục. Những gì bạn có thể viết là:

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

Một nhận xét quan trọng khác: bạn có thể tạo một danh sách trống theo cách này:

strip_list = [0] * 20

Nhưng điều này không phải là quá hữu ích, như .append gắn thêm thứ vào danh sách của bạn. Trong trường hợp của bạn, không hữu ích khi tạo một danh sách với các giá trị mặc định, vì bạn sẽ tạo danh sách đó cho mỗi mục khi thêm các chuỗi bị tước.

Vì vậy, mã của bạn sẽ giống như:

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

Nhưng, chắc chắn, cái tốt nhất là cái này, vì nó giống hệt nhau:

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

Trong trường hợp bạn có một cái gì đó phức tạp hơn chỉ là một .strip, hãy đặt cái này vào một hàm và thực hiện tương tự. Đó là cách dễ đọc nhất để làm việc với danh sách.


2

Nếu bạn chỉ cần loại bỏ khoảng trắng ở cuối , bạn có thể sử dụng str.rstrip(), cách này sẽ hiệu quả hơn một chút so với 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])

Đầu ra:

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

giống như các câu trả lời cũ khác
Jean-François Fabre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.