分割功能 - 避免最后一个空白区域

Jis*_*son 15 python split

我对如何使用split功能有疑问.

str = 'James;Joseph;Arun;'
str.split(';')
Run Code Online (Sandbox Code Playgroud)

我得到了结果 ['James', 'Joseph', 'Arun', '']

我需要输出为 ['James', 'Joseph', 'Arun']

最好的方法是什么?

Mar*_*ers 24

要删除所有空字符串,您可以使用列表推导:

>>> [x for x in my_str.split(';') if x]
Run Code Online (Sandbox Code Playgroud)

或过滤/布尔技巧:

>>> filter(bool, my_str.split(';'))
Run Code Online (Sandbox Code Playgroud)

请注意,这也会在列表的开头或中间删除空字符串,而不仅仅是在结尾处.

如果您只想在结束时删除空字符串,则可以rstrip在拆分之前使用.

>>> my_str.rstrip(';').split(';')
Run Code Online (Sandbox Code Playgroud)

  • +1到目前为止,还没有听说`filer(bool,x)`,只有`filter(None,x)`.你认为哪个更好? (3认同)

Tad*_*eck 17

首先;从字符串的右边缘删除:

s.rstrip(';').split(';')
Run Code Online (Sandbox Code Playgroud)

您也可以使用filter()(这将过滤掉在字符串末尾找不到的空元素).但是在我看来,上面的确是最干净的方法,当你想避免在结尾处出现空元素时,由于;字符串末尾出现" "字符.

编辑:实际上比上面更准确(上面的内容仍然比使用更准确filter())是以下方法:

(s[:-1] if s.endswith(';') else s).split(';')
Run Code Online (Sandbox Code Playgroud)

这将仅删除最后一个元素,并且仅当它被创建为空时.

测试您将看到的所有三种解决方案,它们会给出不同的结果:

>>> 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', '', '']
';;;' => ['', '', '']
Run Code Online (Sandbox Code Playgroud)

  • IMO将它改为`rstrip`,因为他说**最后**空位. (2认同)