我对如何使用拆分功能有疑问。
str = 'James;Joseph;Arun;'
str.split(';')
我得到了结果['James', 'Joseph', 'Arun', '']
我需要输出为['James', 'Joseph', 'Arun']
最好的方法是什么?
答案 0 :(得分:24)
要删除所有空字符串,您可以使用列表解析:
>>> [x for x in my_str.split(';') if x]
过滤器/布尔技巧:
>>> filter(bool, my_str.split(';'))
请注意,这也会在列表的开头或中间删除空字符串,而不仅仅是在结尾处。
如果您只想删除末尾的空字符串,可以在拆分前使用rstrip
。
>>> my_str.rstrip(';').split(';')
答案 1 :(得分:17)
首先从字符串的右边缘删除;
:
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', '', '']
';;;' => ['', '', '']