2012-05-28 4 views
15

スプリット機能の使い方に疑問があります。スプリット機能 - 最後の空きスペースを避ける

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

は私が['James', 'Joseph', 'Arun']

それを行うための最善の方法は何であるとして出力を必要とする結果['James', 'Joseph', 'Arun', '']

を得ましたか。

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

またはフィルタ/ブールトリック:これはまた、開始時や、空の文字列を削除することを

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

(注)リストの内包表記を使用することができ、すべての空の文字列を削除するには

+4

に変数名として 'str'を使用しないでくださいを。これは組み込みの 'str'を隠します。 –

+0

@ Mark Byersご意見ありがとうございます。私の実際のvar名は異なります。 – Jisson

答えて

23

終わりにではなく、リストの真中。

あなたはちょうどあなたが分裂する前にrstripを使用することができます最後に空の文字列を削除する場合。

+3

+1今まで 'filer(bool、x)'について聞いたことがなく、 'filter(None、x)'のみでした。あなたの意見はどちらが良いですか? – jamylak

+1

@jamylak:どちらも問題ありません。私は 'filter(bool、x)'を好む理由は、それがなぜ動作するのかをより明白にするからです。フィルタリング関数として 'None'を使うことは、(なぜそれが動作するかを調べるためにドキュメントを読んでいない限り)魔法のように思えます。しかし、他の人は 'filter(None、x)'を好むので、それほど大きな違いはないと思います。 –

16
>>> my_str.rstrip(';').split(';') 

最初の文字列の右端から;を削除:

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

また(また、文字列の末尾に見出されなかった空の要素を濾別する)filter()を使用することができ。しかし、文字列の末尾に ";"文字があるため、最終的に空の要素を避けたいと思っているときには、私の意見では上記の方法が最もクリーンです。

EDIT:(上記静止filter()を使用するよりも正確である。)上記以外実際にはより正確には、以下のアプローチである。

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

これが最後の要素を除去し、そして場合のみであろうこと空の状態になります。

テストあなたは、彼らが異なる結果を与えることを、表示されますすべての3つのソリューション:

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

関連する問題