如何编写类似于 split() 的函数

How to write a function similar to split()

在我的在线PCAP学习课程中,问了这个问题:
您已经知道 split() 的工作原理。现在我们要你证明这一点。 你的任务是编写你自己的函数,它的行为几乎与原始的 split() 方法完全一样,即:

给出的骨架是:

def mysplit(strng):
    #
    # put your code here
    #


print(mysplit("To be or not to be, that is the question"))
print(mysplit("To be or not to be,that is the question"))
print(mysplit("   "))
print(mysplit(" abc "))
print(mysplit(""))

预期输出为:

['To', 'be', 'or', 'not', 'to', 'be,', 'that', 'is', 'the', 'question']
['To', 'be', 'or', 'not', 'to', 'be,that', 'is', 'the', 'question']
[ ]
['abc']
[ ]

这是我想出的代码:

def mysplit(strng):
        A = ""
        B = []
        for i in strng:
                if i != " ":
                        A += i
                        
                else:
                        B.append(A)
                        A = ""

        return(B)
                        
print(mysplit("To be or not to be, that is the question"))
print(mysplit("To be or not to be,that is the question"))
print(mysplit("   "))
print(mysplit(" abc "))
print(mysplit(""))

但是!我的输出非常接近,但我不确定为什么 ("question") 不在那里,以及为什么假定的空列表中有 [" "]...

['To', 'be', 'or', 'not', 'to', 'be,', 'that', 'is', 'the']
['To', 'be', 'or', 'not', 'to', 'be,that', 'is', 'the']
['', '', '']
['', 'abc']
[]

非常感谢任何帮助!!

查看最后一个字符后,没有其他 " " 可以让您 append 找到最后一个词,所以最后一个词(“问题") 未添加。

解决此问题的一种方法是在 for 循环后添加另一个检查以查看是否需要添加最后一个词。

两个问题:

  1. 您没有将最后一个词附加到 B,因为您只在遇到 space 时才附加,而字符串末尾没有 space。所以你需要附加最后一个字。
  2. 当一行中有多个 space 时,每个 space 都会导致您将空的 A 附加到结果。如果它不为空,您应该只附加 A
def mysplit(strng):
    A = ""
    B = []
    for i in strng:
        if i != " ":
            A += i
        elif A != "":
            B.append(A)
            A = ""
    # Append last word
    if A != "":
        B.append(A)

    return(B)

假设您的字符串是 X Y。你循环 strng。当您遇到 " " 时,您会在列表中追加 X。然后你迭代 Y 并且 A 变成 Y。然后循环终止。因此,Y 从未添加到列表中。

要解决此问题,在循环结束后,只需检查 A 是否包含有效(非空)字符串。如果是,追加。如果字符串的最后一个字符是空格,在这种情况下,循环终止后 A 将保留空字符串,并且不会将其添加到列表中。

对于另一个问题," abc "" ",在追加到列表之前,您可能需要检查 A 它是否为非空字符串。

试试这个 -

def mysplit(strng):
    A = ""
    B = []
    for i in strng:
        if i != " ":
            A += i
        else:
            if A: # Check A is indeed a valid string
                B.append(A)
                A = ""

    # After iteration is over check A contains a valid string. If so append
    if A:
        B.append(A)
    return(B)

检查代码中的注释区域

您需要对代码做一些小改动。您正在将字符串添加到列表中,只有您找到 space 字符。所以在字符串的末尾你找不到要添加的 space 字符。

def mysplit(strng):
    A = ""
    B = []
    for i in strng:
            if i != " ":
                    A += i
                    
            else:
                    B.append(A)
                    A = ""
    B.append(A) # Add A when string is completed

    return(B)

或者您可以维护相同的代码,但只是在获取作为参数时更改输入字符串

strng = strng + ' '

还注意到您没有考虑字符串中有多个 space 的情况。