Удаление пробелов в строке Python

Общий вопрос состоит в том, чтобы удалить все лишние пробелы из строки Python, чтобы между каждым словом был только один пробел, и не было пробелов в начале или конце строки.

Например, "Привет миру" вернется как "Привет миру"

Нам не разрешается использовать команду split или какие-либо команды, кроме базовых строковых операторов (длина и конкатенация), а также команд if и while.

Я написал свою программу так, чтобы она удаляла пробелы в начале строки, а также лишние пробелы между словами, однако, если у меня есть хотя бы один пробел после последнего слова во входной строке, программа возвращает ошибку "index[ я] вне диапазона ".

Вот моя программа:

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)

Надеюсь, кто-нибудь поможет мне определить, что с ним не так. Кажется, что я попробовал все, но я знаю, что это просто моя неопытность с питоном.

5 ответов

Решение

Вы должны проверить свой я в диапазоне в еще одном месте. Дайте этому шанс:

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)

На самом деле есть простое и умное решение. + Изменить

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

чтобы...

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

Это работает, потому что Python коротких замыканий and если в любой точке встречается ложное значение. Это означает, что после i<len(s) оценивает False и Python встреч and, он сразу перейдет к elif или же else пункты, если таковые имеются. Таким образом, вторая половина никогда не оценивается, поэтому нет IndexError,

Теперь эта программа не работает идеально. Есть другие проблемы с этим, но так как это домашнее задание, я не хочу предлагать больше помощи. Помимо этой подсказки: вам нужен еще один цикл while.

Вот ваша структура реализации с необходимыми изменениями:

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)

Что изменилось:

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

Для того, чтобы:

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

Но это будет держать еще один пробел в конце, так что

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

Наслаждаться.

Используя некоторую рекурсию

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() просто дает строку в кавычках, чтобы увидеть фактическое количество пробелов до и после слов.

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 '))
Другие вопросы по тегам