Очистка строки без разделения / стрип / встроенных функций - PullRequest
0 голосов
/ 23 ноября 2018

Мои требования

Используйте Python для создания функции cleanstring(S) для "очистки" пробелов в предложении S.

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

Эта программа о том, что вы пишете код для поиска по строке, чтобы найти слова, и поэтому вы не можете использовать функцию разделения в Python.

Вы можете решить эту проблему с помощью базовых возможностей операторов if и while и строковых операций len и конкатенации.

Например: если введено: «Привет миру!»тогда вывод должен быть: "Привет миру!"

Вопрос

Моя программа удаляет в программе больше символов, чем необходимо.

Ввод: "Hello World!"

Вывод: "HellWorl"

Как исправить ошибку в моей программе?

def cleanupstring (S):
    newstring = ["", 0]
    j = 1
    for i in range(len(S) - 1):
        if S[i] != " " and S[i+1] != " ":
            newstring[0] = newstring[0] + S[i]
        else:
            newstring[1] = newstring [1] + 1
    return newstring

# 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]) 

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Добро пожаловать в 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 высоко ценит читабельность, потому что с читаемым кодом легче понять замысел автора.Если ваш код сложен для понимания, есть большая вероятность, что вам все же придется провести рефакторинг!

0 голосов
/ 23 ноября 2018

Если «пробел» - это буквально пробелы, а не пробелы, тогда сработает следующее:

import re
def clean_string(value):
     return re.sub('[ ]{2,}', ' ', value.strip())

Если раздельные значения содержат последовательные пробелы, замените их одним пробелом.

0 голосов
/ 23 ноября 2018

Мой подход заключается в том, чтобы оставить последний доступный символ и принять решение, является ли он пробелом или нет:

def cleanupstring (S):
    newstring = ["", 0]
    last_character = ' ' # catch initial spaces
    for i in range(len(S)-1):
        char = S[i]
        if char is ' ' and last_character is ' ':
            continue # ignore
        else:
            last_character = char
            newstring [0] = newstring[0] + char

    return newstring
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...