Преобразование подряд идущих пробелов в один в python

Ввожу этот код:

a = input()
for i in range (len(a)):
  if (ord(a[i])) == 32:
    while(ord(a[i + 1])) == 32:
      a = a[:i + 1] + a[i + 2:]
print(a)

Пишет: string index out of range


Ответы (2 шт):

Автор решения: Nenza

Как вариант, самый простой для понимания

a = input()
while "  " in a:
    a= a.replace("  ", " ")
print(a)

А так в комментариях ответили почему:

Вполне закономерное поведение на такой код, если вам не готовое а понять причину то: вот a = a[:i + 1] + a[i + 2:] в этой строке вы пытаетесь получить доступ к символам которых нет, когда подходите к чтению двух последних символов строки

Исправить именно ваш код можно добавив дополнительное условие или))) сделать так(это если что шутка):

a = input()
try:
    for i in range (len(a)):
        if (ord(a[i])) == 32:
            while(ord(a[i+1])) == 32:
                a = a[:i + 1] + a[i + 2:]
except:
    print(a)
→ Ссылка
Автор решения: Stanislav Volodarskiy

Ошибка потому что вы меняете строку во время обработки. Это можно поправить, но код будет сложным. Проще придерживаться правила о неизменности структуры контейнера в цикле for. Я хотел сказать - не нужно редактировать строку. Если простота кода вас не интересует, то добавлю что это ещё и очень не эффективно.

Если в сроке единственный пробел - последний символ, вы тоже обратитесь за конец строки. Если есть возможность не обращаться к строке по индексу, этого не надо делать. Индексация - низкоуровневое средство, требует аккуратности.

prev_space - флаг "предыдущий символ - пробел". Бежим по строке, символы накапливаем в списке. Обращений по индексам нет.

В конце список преобразуем в строку:

def join_spaces(s):
    result = []
    prev_space = False
    for c in s:
        space = c == ' '
        if not prev_space or not space:
            result.append(c)
        prev_space = space
    return ''.join(result)


print(join_spaces(input()))

Если в коде на Питоне есть накопление элементов в списке, обычно его можно заменить на генератор:

def join_spaces(s):
    prev_space = False
    for c in s:
        space = c == ' '
        if not prev_space or not space:
            yield c
        prev_space = space


print(''.join(join_spaces(input())))

Правильно решить задачу через регулярное выражение ' +'. Оно соответствует любому числу пробелов подряд. re.sub заменит его на одиночный пробел:

import re


def join_spaces(s):
    return re.sub(' +', ' ', s)


print(join_spaces(input()))
→ Ссылка