Удаление пробелов в строке 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 '))