2012-05-28 46 views
15

我對如何使用拆分功能有疑問。拆分功能 - 避免最後一個空白空間

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

我得到的結果['James', 'Joseph', 'Arun', '']

我需要的輸出['James', 'Joseph', 'Arun']

什麼是做到這一點的最好方法是什麼?

+4

請不要用'str'作爲變量名。它隱藏了內置的'str'。 –

+0

@馬克·拜爾斯感謝您的評論,我的實際var名稱是不同的。 – Jisson

回答

23

要刪除所有空字符串,你可以使用列表理解:

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

或過濾器/布爾招:

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

注意,這也將在啓動或刪除空字符串名單的中間,不僅在最後。

如果你只是想刪除末尾的空字符串,你可以拆分之前使用rstrip

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

+1直到現在還沒有聽說過'filer(bool,x)',只有'filter(None,x)'。你認爲哪個更好? – jamylak

+1

@jamylak:兩者都很好。我更喜歡'filter(bool,x)',因爲它使得它更明顯,它爲什麼有效。使用'None'作爲過濾函數看起來很神奇(除非你已經閱讀了文檔以找出它的工作原理)。但其他人更喜歡'filter(None,x)',所以我認爲這沒什麼區別。 –

16

首先從字符串的右邊緣除去;

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

也可以使用filter()(其將過濾掉也了未在字符串的結尾處找到空元素) 。但是,在我看來,上面實際上是最乾淨的方法,因爲當字符串末尾出現「;」字符時,您最終要避免出現空元素。

編輯:其實比上述更準確(以上地方仍比使用filter()更準確)是以下方法:

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

這將只刪除最後一個元素,且僅當它將被創建爲空。

測試的所有三種解決方案,你會看到,他們給不同的結果:

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

簡單而有效 –

+2

IMO自從他說**最後**空白空間後將其更改爲「rstrip」。 – jamylak

+1

@jamylak:是的,當你寫評論時,我一直在添加這些信息。請參閱最新的答案。 – Tadeck