问题描述
||
我写这个:
def split(line,delim):
s=[]
j=0
for i in range (len(line)-1):
if delim== line [i]:
s.append(line[j:i])
j=i+1
s.append (line[j:])
return s
但是当我放一行并且结尾字母是delim时,它也会返回delim
像这样:
split(\'bndghsjhskashakhs\',\'s\')
[\'bndgh\',\'jh\',\'ka\',\'hakhs\']
解决方法
问题出在您:
for i in range (len(line)-1):
这将从第一个字符迭代到最后一个字符。它忽略最后一个字符。更改为:
for i in range (len(line)):
现在返回[\'bndgh\',\'jh\',\'ka\',\'hakh\',\'\']
。
无论如何,正如其他张贴者所写,您可以使用标准的.split()
功能。
如果要删除空元素,可以在末尾添加一个过滤器:
return [ item for item in s if item ]
代替
return s
或直接使用标准拆分而不使用您的功能:
[ item for item in line.split(\'s\') if item ]
或最短版本:
filter(None,line.split(\'s\'))
,您应该使用本机拆分,而不是重写自己的拆分:
\'bndghsjhskashakhs\'.split(\'s\')
,首先,您应该使用内置的string.split(\'s\')
这样的东西,它将省去任何麻烦。
您缺少最后一个字符的原因是:
for i in range (len(line)-1):
range
将返回0..max-1,因此您实际上是在尽早停止字符。
删除-1,它应该可以工作。
,怎么样:
>>> \'bndghsjhskashakhs\'.split(\'s\')
[\'bndgh\',\'\']
或者,如果您不想使用空值:
>>> filter(lambda x: x,\'bndghsjhskashakhs\'.split(\'s\'))
[\'bndgh\',\'hakh\']