如何在不使用任何方法或函数的情况下实现.split的字符串版本?

时间:2018-03-23 23:50:25

标签: python string split

这就是我的问题

编写一个名为str_redux.py的文件,该文件在不使用任何字符串方法或函数的情况下实现字符串方法find和split的版本。

特别是,定义一个函数myfind,使myfind(s,t)做与s.find(t)相同的事情;和一个函数mysplit,使mysplit(s,t)做与s.split(t)相同的事情。

您的解决方案中不得使用任何字符串方法。所有运营商(包括in,[index],[i1:i2]等)都是公平的游戏。没有任何函数(也不是文件本身)应该打印任何内容,也不要求任何输入。

除功能正确性外,还会为

保留一些要点

具有良好的变量名称 为您编写的所有函数提供有意义的文档字符串

def myfind(whole,part):
"""Docstring: searches for a string (whole) for a segment which is (part) and returns the index"""

    if part in whole:
        for n in range(len(whole)):
            sub = whole[n:n+len(part)]

            if part in sub: #Use of if-in function to find out if our segment is in our word
                return n
                break
    else:
        return -1 # Doesn't exist within the string


def mysplit(whole, part):
    """Docstring: when given a word, will seperate the word into predetermined chunks"""

    split_word = []
    position_start = 0
    while part in whole [position_start::]:
        new_position = myfind(whole,part)
        split_segment = whole[position_start: new_position+position_start]
        split_word.append(split_segment)
        if new_position == -1:
            break
        position_start = new_position+len(part)+position_start
    split_word.append(whole[position_start:])
    return split_word

当我测试时:

import str_redux

print(str_redux.myfind('divided','d'))
print(str_redux.myfind('divided','id'))
print(str_redux.myfind('divided','ido'))

print()

print(str_redux.mysplit('divided','d'))
print(str_redux.mysplit('divided','id'))
print(str_redux.mysplit('divided','ido'))

我明白了:

0
3
-1

['', '', '', '', '', '', '', '']
['div', 'ed']
['divided']

应该是:

0
3
-1

['', 'ivi', 'e', '']
['div', 'ed']
['divided']

有谁知道我做错了什么?我知道我的错误是在代码的第二部分,但我不知道在哪里。

2 个答案:

答案 0 :(得分:1)

此行new_position = myfind(whole,part)将始终返回0,因为您每次都测试相同的内容。

new_position = myfind(whole[position_start:], part)我相信你的想法。

答案 1 :(得分:-1)

这是解决问题的另一种方法。

def splitter(mystr, char=','):
    var = ''
    n = len(mystr)
    for idx, i in enumerate(mystr, 1):
        if i != char:
            var += i
        if (i == char) or (idx == n):
            yield var
            var = ''

res = list(splitter('Hello, this is a test, see if it works!'))

# ['Hello', ' this is a test', ' see if it works!']