Добро пожаловать в Stackoverflow.Когда я начал читать, я подумал, что это будет вопрос «пожалуйста, ответьте на мою домашнюю работу», но вы действительно приложили немало усилий для решения проблемы, поэтому я с радостью постараюсь помочь (только вы можете сказать,Я на самом деле знаю).
Иногда, когда вы изучаете новый язык, бывает трудно отбросить методы, которые намного более уместны в других языках.Делая это символ за символом, вы обычно просто используете for c in s
вместо того, чтобы увеличивать значения индекса, как это было бы в C (хотя любой подход работает, приращение индекса там, где это не нужно, иногда рассматривается как «не пифоническое»).Похоже, ваша основная идея состоит в том, чтобы обнаружить пробел, за которым следует другой пробел, в противном случае копирование символов с входа на выход.
Логика может быть упрощена путем сохранения последнего символа, отправленного вами на выход .Если это пробел, не отправляйте больше пробелов.Цикл в начале избавляет от любых начальных пробелов, и, поскольку в конце может быть не более одного пробела, его можно легко устранить, если он присутствует.
Я не уверен, почему вы используете список для сохраненияваши результаты в, так как это делает код гораздо сложнее для понимания.Если вам нужно вернуть несколько частей информации, гораздо проще вычислить их в отдельных переменных, а затем сконструировать результат в операторе return
.
Таким образом, одной из желательных модификаций будет замена newstring[0]
на, скажем,, out_s
и newstring[1]
с, скажем, count
.Это немного прояснит, что происходит.Затем в конце return [out_s, count]
, если вам действительно нужен список.Кортеж, использующий return out_s, count
, был бы более обычным.
def cleanupstring (s):
out_s = ''
count = 0
last_out = ' '
for c in s:
if c != ' ' or last_out != ' ':
last_out = c
out_s += c
else:
count += 1
if last_out == ' ':
count -= 1
out_s = out_s[:-1]
return out_s, count
# main program
sentence = input("Enter a string: ")
outputList = cleanupstring(sentence)
print("A total of", outputList[1], "characters have been removed from your string.")
print("The new string is:", outputList[0])
Иногда у вас просто нет определенной информации, которая могла бы помочь вам ответить на вопрос чрезвычайно кратко.Скорее всего, вас еще не учили методам strip
и replace
, и поэтому я полагаю, что следующий (не проверенный) код
def cleanupstring(s):
out_s = s
while ' ' in out_s:
out_s = out_s.strip().replace(' ', ' ')
return out_s, len(s)-len(out_s)
будет правильным.
Кроме того, вы можете использовать «распаковку присваивания», чтобы связать различные элементы вывода функции непосредственно с именами, написав
s, c = cleanupstring(...)
Я уверен, что вы согласитесь, что
print("A total of", c, "characters have been removed from your string.")
print("The new string is:", s)
довольно легко читать.Python высоко ценит читабельность, потому что с читаемым кодом легче понять замысел автора.Если ваш код сложен для понимания, есть большая вероятность, что вам все же придется провести рефакторинг!