删除Python字符串中的空格

Removing White Spaces in a Python String

一般的问题是从python字符串中删除所有多余的空格,以便每个单词之间只有一个空格,并且字符串的开头或结尾没有空格。

例如,
'Hello to the world'将以'Hello to the world'的形式回归

除了基本字符串运算符(长度和连续)以及if和while命令之外,我们不允许使用split命令或任何命令。

我编写了我的程序,以便它删除字符串开头的空格以及单词之间的额外空格,但是,如果我在输入字符串中的最后一个单词之后有一个空格,程序将返回错误"index [ 我]超出范围"。

这是我的计划:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def cleanstring (s):
    i=0
    while s[i]==' ':
        i=i+1
    s=s[i:len(s)]
    i=0
    while i<len(s):
        if s[i]!=' ':
            i=i+1
        else:
            if i<len(s) and s[i]==' ':
                i=i+1
            if s[i]==' ' and i+1<len(s):
                s=s[0:i]+s[i+1:len(s)]
                i=0
    return(s)

希望有人可以帮我确定它有什么问题。 好像我已经尝试了一切,但我知道这只是我对python的经验不足。


实际上有一个简单而聪明的解决方案。更改

1
if s[i]==' ' and i+1<len(s):

至...

1
if i<len(s) and s[i]==' ':

这是有效的,因为如果在任何点遇到假值,Python就会短路and。这意味着在i评估为False并且Python遇到and之后,如果存在,它将立即转到elifelse子句。因此,从未评估后半部分,因此没有IndexError

现在,这个程序并不完美。还有其他问题,但由于这是一项家庭作业,我不愿意提供更多帮助。除了这个提示:你需要另一个while循环。


使用一些递归

1
2
3
4
5
6
7
8
9
10
def cleanString(word):
    if word[0]=="":
        if len(word)>1:
            return cleanString(word[1:])
        return word[1:]
    elif len(word)>1:
        return word[0]+cleanString(word[1:])
    return word
print cleanString("   abcd ") =="abcd" # True
print cleanString("   abcd ") # abcd


这似乎工作得很好。
看看这个。
repr()只是在引号中给出字符串,以便查看单词前后的实际空格数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def cleanstring (s):
    hit_letter = False
    space_counter = 0
    tmp = list()
    for letter in s:
        if letter.isalpha():
            space_counter = 0
            hit_letter = True
            tmp.append(letter)
            print letter
        elif hit_letter:
            space_counter += 1
            if space_counter < 2:
                tmp.append(letter)
    return ''.join(tmp[:-1])


print repr(cleanstring('  Hi to the  world '))

这是您的实现结构,包含所需的更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def cleanstring (s):
    i=0
    while s[i]==' ':
        i=i+1
    s=s[i:len(s)]
    i=0
    while i<len(s):
        if s[i]!=' ':
            i=i+1
        else:
            if i<len(s) and s[i]==' ':
                i=i+1
            if i<len(s) and s[i]==' ':
                s=s[0:i]+s[i+1:len(s)]
                i=0
    if s[-1] == ' ':
        s = s[:-1]
    return(s)

改变的是:

1
if s[i]==' ' and i+1<len(s):

至:

1
if i<len(s) and s[i]==' ':

但是这最终会留下一个空间,所以

1
2
if s[-1] == ' ':
            s = s[:-1]

请享用。


您需要在另外一个地方检查您的i是否在范围内。试一试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def cleanstring(s):
    i=0
    while s[i]==' ':
        i=i+1
    s=s[i:len(s)]
    i=0
    while i<len(s):
        if s[i]==' ':
            if (i+1)<len(s) and s[i+1]==' ':
                s=s[0:i]+s[i+1:len(s)]
            else:
                i=i+1
        else:
            i=i+1
    if s[len(s)-1]==' ':
        s=s[0:len(s)-1]
    return(s)