16

分割関数の使い方に疑問があります。

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

結果が出ました['James', 'Joseph', 'Arun', '']

私は次のように出力が必要です['James', 'Joseph', 'Arun']

それを行うための最良の方法は何ですか?

4

2 に答える 2

27

空の文字列をすべて削除するには、リスト内包表記を使用できます。

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

または、フィルター/ブールトリック:

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

これにより、リストの最後だけでなく、リストの最初または途中の空の文字列も削除されることに注意してください。

最後に空の文字列を削除したいだけの場合は、rstrip分割する前に使用できます。

>>> my_str.rstrip(';').split(';')
于 2012-05-28T06:47:46.250 に答える
18

;まず、文字列の右端から削除します。

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

を使用することもできますfilter()(これにより、文字列の最後に見つからなかった空の要素も除外されます)。;しかし、文字列の最後に""文字が含まれているために、最後に空の要素を避けたい場合は、上記が私の意見では本当に最もクリーンなアプローチです。

編集:実際には上記よりも正確です(上記が使用するよりもさらに正確である場合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', '', '']
';;;' => ['', '', '']
于 2012-05-28T06:48:51.397 に答える