2012-05-28 31 views
15

Tôi có nghi ngờ về cách sử dụng chức năng chia tách.Tách chức năng - tránh không gian trống cuối cùng

str = 'James;Joseph;Arun;' 
str.split(';') 

tôi đã có kết quả ['James', 'Joseph', 'Arun', '']

tôi cần đầu ra như ['James', 'Joseph', 'Arun']

cách tốt nhất để làm điều đó là gì?

+4

Xin đừng sử dụng 'str' như một tên biến. Nó ẩn 'str'. –

+0

@ Mark Byers cảm ơn bạn đã bình luận của bạn, tên var thực tế của tôi là khác nhau. – Jisson

Trả lời

23

Để loại bỏ tất cả các chuỗi sản phẩm nào bạn có thể sử dụng danh sách hiểu:

>>> [x for x in my_str.split(';') if x] 

Hoặc lừa lọc/bool:

>>> filter(bool, my_str.split(';')) 

Lưu ý rằng điều này cũng sẽ loại bỏ chuỗi trống ở đầu hoặc ở giữa danh sách, không chỉ ở cuối.

Nếu bạn chỉ muốn loại bỏ các chuỗi rỗng ở cuối bạn có thể sử dụng rstrip trước khi tách.

>>> my_str.rstrip(';').split(';') 
+3

+1 Đã không nghe nói về 'filer (bool, x)' cho đến bây giờ, chỉ 'filter (None, x)'. Điều nào tốt hơn trong ý kiến ​​của bạn? – jamylak

+1

@jamylak: Cả hai đều ổn. Tôi thích 'bộ lọc (bool, x)' bởi vì nó làm cho nó rõ ràng hơn tại sao nó hoạt động. Sử dụng 'None' như một chức năng lọc có vẻ giống như ma thuật (trừ khi bạn đã đọc tài liệu để tìm hiểu lý do tại sao nó hoạt động). Nhưng những người khác thích 'filter (None, x)' vì vậy tôi đoán nó không tạo ra nhiều khác biệt. –

16

Đầu tiên loại bỏ ; từ mép bên phải của chuỗi:

s.rstrip(';').split(';') 

Bạn cũng có thể sử dụng filter() (mà sẽ lọc ra cũng phần tử rỗng mà không được tìm thấy ở phần cuối của chuỗi) . Nhưng ở trên thực sự là cách tiếp cận sạch nhất theo ý kiến ​​của tôi, khi bạn muốn tránh phần tử trống ở cuối, kết quả là ";" các ký tự xảy ra ở cuối chuỗi.

EDIT: Thực ra chính xác hơn ở trên (nơi ở trên là vẫn còn chính xác hơn bằng filter()) là phương pháp sau đây:

(s[:-1] if s.endswith(';') else s).split(';') 

này sẽ chỉ xóa các yếu tố cuối cùng, và chỉ khi nó sẽ được tạo ra trống.

kiểm tra cả ba giải pháp mà bạn sẽ thấy, mà họ đưa ra kết quả khác nhau:

>>> def test_solution(solution): 
    cases = [ 
     'James;Joseph;Arun;', 
     'James;;Arun', 
     'James;Joseph;Arun', 
     ';James;Joseph;Arun', 
     'James;Joseph;;;', 
     ';;;', 
     ] 
    for case in cases: 
     print '%r => %r' % (case, solution(case)) 

>>> test_solution(lambda s: s.split(';')) # original solution 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun', ''] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph', '', '', ''] 
';;;' => ['', '', '', ''] 
>>> test_solution(lambda s: filter(bool, s.split(';'))) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph'] 
';;;' => [] 
>>> test_solution(lambda s: s.rstrip(';').split(';')) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph'] 
';;;' => [''] 
>>> test_solution(lambda s: (s[:-1] if s.endswith(';') else s).split(';')) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph', '', ''] 
';;;' => ['', '', ''] 
+0

Đơn giản và hiệu quả –

+2

IMO thay đổi nó thành 'rstrip' kể từ khi ông nói ** không gian trống ** cuối cùng. – jamylak

+1

@jamylak: đúng, tôi đã thêm thông tin đó khi bạn viết nhận xét của mình. Vui lòng xem câu trả lời được cập nhật. – Tadeck

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