清理没有拆分/剥离/内置功能的字符串

时间:2018-11-22 22:14:56

标签: python string indexing

我的要求

使用Python创建函数cleanstring(S)来“清理”句子S中的空格。

  • 句子的开头和/或结尾和/或单词之间可能有多余的空格。
  • 子例程返回句子的新版本,不带多余的空格。
    • 也就是说,在新字符串中,单词应相同,但开头不应有空格,每个单词之间仅应有一个空格,而结尾应无空格。

该程序与您编写代码以搜索字符串以查找单词有关,因此您不可以在Python中使用split函数。

您可以使用if和while语句的基本功能以及len和concatentation的字符串操作来解决此问题。

例如:如果输入为:“世界你好!”那么输出应该是:“世界你好!”

问题

我的程序删除了程序中多余的字符。

输入:“ 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 :(得分:2)

欢迎使用Stackoverflow。当我开始阅读时,尽管这将是一个“请回答我的作业”问题,但实际上您在解决问题上已经做出了相当大的努力,因此,我很乐于尝试并提供帮助(只有您可以说出是否我实际上是这样做的。)

当您学习一种新语言时,有时很难放弃其他语言更合适的技术。通常一个字符一个字符地完成操作,通常只使用for c in s而不是像在C语言中那样递增索引值(尽管这两种方法都行得通,有时将不必要的索引递增有时视为“ unpythonic”)。您的基本想法似乎是先检测一个空格,再检测另一个空格,否则将字符从输入复制到输出。

可以通过保留发送到输出的最后一个字符来简化逻辑。如果是空格,请不要再发送空格。前面的一个循环消除了任何前导空格,并且由于末尾最多可以有一个空格,因此如果存在,可以很容易地消除。

我不确定您为什么使用列表来保留结果,因为这会使代码更难以理解。如果您需要返回多条信息,则在单个变量中计算它们然后在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])

有时候,您只是没有某些信息可以帮助您非常简洁地回答问题。您很可能尚未听说过stripreplace方法,因此我想像一下以下(未经测试的)代码

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高度重视可读性,因为使用可读代码可以更轻松地理解作者的意图。如果您的代码难以理解,那么您仍有很大的机会要做重构!

答案 1 :(得分:1)

如果“空格”实际上是空格而不是空格,则可以执行以下操作:

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

如果剥离的值包含连续的空格,则替换为一个空格。

答案 2 :(得分:0)

我的方法是保持最后一个字符可用,并确定是否为空格:

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