2011-11-02 29 views
68

tôi phải mất một danh sách lớn của các từ trong các hình thức:Strip tất cả các yếu tố của một danh sách chuỗi

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

và sau đó sử dụng chức năng 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 vẫn nhận được thông báo lỗi:

"'list' object has no attribute 'strip'"

Đâ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 bạn thêm 0 đến 'strip_list' 19 lần rồi thêm các dòng bị tước. Mã đó có mùi rất xấu về nó. Ngoài ra nếu bạn có những thứ đó từ một tập tin, bạn nên loại bỏ nó trên đường - xây dựng một danh sách lớn sau đó bashing nó vào một danh sách lớn không phải là một ý tưởng tốt. Ngoài ra 2, 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. Bước 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'? –

+0

Có liên quan [Cách xóa \ n khỏi phần tử danh sách?] (Http: // stackoverflow.com/q/3849509) –

Trả lời

128
>>> 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'] 
+0

sau đó tôi có thể nói stripped_list = map (str.strip, my_list) và sau đó in stripped_list để in danh sách mới này? –

+0

@GeorgeBurrows Có. – agf

+16

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

31

Bạn có thể sử dụng lists comprehensions:

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

Hoặc map chứ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. –

+1

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

+1

Trong Python 3, dạng thứ 3 "không có lambda" nên là 'strip_list = list (map (str) .strip, lines)) 'như map() trả về một iterator bản đồ. https://docs.python.org/3/library/functions.html#map – Devy

7

Điều này có thể được thực hiện bằng comprehensions danh sách theo quy định tại PEP 202

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

Tôi đã nghĩ đến việc thay đổi tên từ 'list' thành' map' :) – Casey

2

Tất cả khác câu trả lời, một thứ chủ yếu về việc hiểu danh sách, là rất tố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()) 

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

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

Một bình luận quan trọng: 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ư .appendgắn thứ vào danh sách của bạn . Trong trường hợp của bạn, sẽ không hữu ích khi tạo danh sách có giá trị defaut, vì bạn sẽ tạo mục đó cho mỗi mục khi thêm chuỗi bị tước.

Vì vậy, mã của bạn nên được như thế:

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

Nhưng, chắc chắn, tốt nhất là thế này, vì đây là chính xác những điều tương tự:

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, đặt nó vào một hàm và làm như vậy. Đó là cách dễ đọc nhất để làm việc với các danh sách.

Các vấn đề liên quan