Преобразование подряд идущих пробелов в один в 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 шт):
Как вариант, самый простой для понимания
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)
Ошибка потому что вы меняете строку во время обработки. Это можно поправить, но код будет сложным. Проще придерживаться правила о неизменности структуры контейнера в цикле 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()))