关于python:split函数-避免最后一个空格

Split function - avoid last empty space

我对如何使用拆分函数有疑问。

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

我得到了结果。

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

最好的方法是什么?


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

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

或者过滤/布尔技巧:

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

请注意,这还将删除列表开头或中间的空字符串,而不仅仅是结尾的空字符串。

  • 从字符串列表中删除空字符串

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

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


首先从字符串右边缘移除;

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

您还可以使用filter()(这将过滤掉字符串末尾未找到的空元素)。但在我看来,如果您希望避免在字符串末尾出现";字符",那么上面的方法确实是最干净的方法。

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
>>> 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', '', '']
';;;' => ['', '', '']