需要删除字符串中所有多余的空格,包括开头和结尾处的空格。我不能使用拆分功能。只有if和while语句。到目前为止我有这个,但每次运行它时,它只会以完全相同的方式返回输入。
def cleanstring(S):
i=0
startpos=0
endpos=0
end=-1
word=0
#find position of first letter
while S[i]==(" "):
i=i+0
startpos=i
#find last letter
while (S[end]==(" ")):
end=end-1
endpos=S[len(S)-end]
#make first letter found the first letter in the string
if S[i]!=(" "):
word=S[i]
#start between startpos and endpos to find word
while (i<endpos) and (i>startpos):
while S[i]!=(" "):
word=word+S[i]
if S[i]==(" "):
if (S[i+1]==("")) or (S[i-1]==(" ")):
word=word+(" ")
else:
word=word+(" ")
#return the word
print(word)
Input=[" Hello to the world "]
答案 0 :(得分:1)
Concat转到临时字符串,如果你点击一个空格字符检查临时字符串是否为空,如果没有产生它并重置临时字符串。
s = " Hello to the world "
def split(s):
temp_s = ""
for ch in s:
if ch.isspace():
if temp_s:
yield temp_s
temp_s = ""
else:
temp_s += ch
if temp_s:
yield temp_s
输出:
In [5]: s = " Hello to the world "
In [6]: list(split(s))
Out[6]: ['Hello', 'to', 'the', 'world']
In [7]: s = " Hello\tto\r\nthe world "
In [8]: list(split(s))
Out[8]: ['Hello', 'to', 'the', 'world']
In [10]: list(split(s))
Out[10]: ['Hello', 'world']
In [11]: s = "Hello"
In [12]: list(split(s))
Out[12]: ['Hello']
显然,如果需要,你可以将for改为while循环。
答案 1 :(得分:0)
如果使用带有空格的字符串调用cleanstring函数,则会导致无限循环:
while S[i]==(" "):
i=i+0
startpos=i
由于你向i添加零,它永远不会改变。你应该将它增加1,这可以这样做:
i += 1
这是
的简写i = i + 1
但是,Input甚至不是字符串,而是包含字符串的列表。您应该将输入表达式更改为此
Input = " Hello to the world "
你所拥有的方括号使它成为一个包含字符串的列表。
答案 2 :(得分:0)
使用for
:
def cleanstring(str_in):
str_out = ''
last_char = None
for cur_char in str_in:
str_out += '' if last_char == ' ' and cur_char ==' ' else cur_char
last_char = cur_char
return str_out
使用while
:
def cleanstring(str_in):
str_out = ''
last_char = None
index = 0
while str_in[index:index+1]:
cur_char = str_in[index:index+1]
str_out += '' if last_char == ' ' and cur_char ==' ' else cur_char
last_char = cur_char
index+=1
return str_out
如果最后一个字符和当前是空格,则不要附加空格。
我们假设空间是唯一关注的空白。否则,这是一组空格的解决方案:
def cleanstring(str_in):
str_out = ''
last_char = None
index = 0
whitespace = [' ','\t','\n','\r','\f','\v']
while str_in[index:index+1]:
a = str_in[index:index+1]
str_out += '' if last_char in whitespace and a in whitespace else a
last_char = a
index+=1
return str_out
除了第一个检测到的条目外,它会删除所有空格,但是如果我们要删除与相邻空格类似的空格并留下第一个检测到的实例:
def cleanstring(str_in):
str_out = ''
last_char = None
index = 0
whitespace = [' ','\t','\n','\r','\f','\v']
while str_in[index:index+1]:
a = str_in[index:index+1]
str_out += '' if last_char == a and a in whitespace else a
last_char = a
index+=1
return str_out
如果您担心使用in
,可以将其替换为(使用cleanstring
的最后一个实例作为示例):
def cleanstring(str_in):
def is_whitespace_in(char):
whitespace = [' ','\t','\n','\r','\f','\v']
local_index = 0
while whitespace[local_index:local_index+1]:
a = whitespace[local_index:local_index+1][0]
if a[0] == char:
return True
local_index+=1
return False
str_out = ''
last_char = None
index = 0
while str_in[index:index+1]:
a = str_in[index:index+1]
str_out += '' if last_char == a and is_whitespace_in(a) else a
last_char = a
index+=1
return str_out
最后一个例子的空白来自Cython re
's \s
definition:
\s Matches any whitespace character; equivalent to [ \t\n\r\f\v] in bytes patterns or string patterns with the ASCII flag.
第73-74行
我知道这可能不是最符合Pythonic或PEP8的,请随时编辑。
答案 3 :(得分:0)
只需使用string.strip()
方法。
答案 4 :(得分:0)
这种功课还是什么? 如果您不能使用&#39;只有&#39;如果&#39;然后&#39;当我使用计数器并检查字符串中的每个字符时。
def clean(input):
idx = 0
out = input[idx]
while idx < len(input):
if input[idx] != out[-1] or input[idx] != ' ':
out += input[idx]
idx+=1
return out
当然,它不是完整的解决方案,但你明白了。
答案 5 :(得分:-1)
请阅读以下评论。
TABLE = str.maketrans('','',' \n\r\t\f')
def clrstr(inp):
return inp.translate(TABLE)
但是,如果您正在学习while和for循环,那对它没有多大帮助。