作者:穿靴子的猫 | 来源:互联网 | 2023-09-17 15:56
自定义实现str的spilt方法:如果切割符为默认值:字符串首尾的空白字符去掉,不参与分割,即不像指定分隔符会切割出空字符串指定切割符不能是空字符串最大切割次数,默认为-1切割次数
飞艇稳赚不赔的打法
自定义实现str的spilt方法:
如果切割符为默认值:字符串首尾的空白字符去掉,不参与分割,即不像指定分隔符会切割出''空字符串指定切割符不能是空字符串最大切割次数,默认为-1切割次数为负数时,整个字符串切割正数时,切割给定的次数
# 自定义实现split方法:# 算法:# 1. 遍历这个字符串,start=0,# 判断当前字符以及后续的几个字符是否时sep# 如果不是,就继续遍历,如果是,就把这个位置记录下来作为end的坐标# 2. 基于start和end的切片,取出来内容,放到一个结果list里面去# 3. start设定为下一个要遍历的坐标,重复上述的过程# start=0,遍历s,找到sep的内容# 坐标为2的时候是个空白,end=2# s[start:end] ---> he ---> 放到一个list里面# 继续向后遍历,找到非空白的时候,start=4# 继续遍历,找到sep,end=6,s[start:end] ---> is放到结果list里面去# 字符串已经到了最后end=len(s) # 0123456789# 'he is boy'def split(s, sep=None, maxsplit=-1): # s不是str类型,结束程序 if not isinstance(s, str): return None # (not (sep is None or isinstance(sep, str))) ---> sep不是None也不是str类型,为True # sep == '' ---> sep为空字符串,为True # 两者满足一个,就结束程序,即sep不为None,或者是不为空的字符串 if (not (sep is None or isinstance(sep, str))) or sep == '': return None # maxsplit必须是int类型,否则结束程序 if not isinstance(maxsplit, int): return None if maxsplit == 0: # 切割次数为0的时候,直接返回一个列表,列表包含默认字符串 return [s] result = [] # 切割后单词的list length = len(s) - 1 # 字符串最后一个字符的坐标 start = 0 # 从0位置开始取字符串 end = length # end先设定为最后一个字符 i = 0 # 从0开始遍历 if sep is None: sep = '\t\r\n ' flag = True # 标志位:表示是否遇到切割的字符,遇到就设定为False while i <= length: # 没有遍历到结尾的时候,就一直执行while # s[i] in sep ---> 遇到了切割字符 # flag为True ---> 当前i的前面不是sep # i == length ---> 判断当前位置是否到了结尾 if s[i] in sep and flag: end = i # 将end设定为当前位置 flag = False # 标志位设定为False,表示遇到了sep if start != end: # start != end ---> 即start和end相等时,不切割,根据split规格,字符串前面如果是空白字符,不进行切割 if maxsplit <0: # 根据split的规则,maxsplit小于0时,不限制切割次数 result.append(s[start:end]) # 将start和end之间的内容,放到结果list里面 elif maxsplit > 0: # 有切割次数的时候,且大于0时执行 result.append(s[start:end]) maxsplit -= 1 else: result.append(s[start:]) # maxsplit为0时执行,指定切割次数小于切割符在字符串中的个数,随着maxsplit的递减,才会出现maxsplit为0的情况 break elif s[i] not in sep: # 判断当前字符不是sep if not flag: # 如果flag是False start = i # start设定为i,start位置是开始要取的字符串的内容 flag = True # 把标志位改为True i += 1 # 遇到下一个遍历的字符 if i == length and s[i] not in sep: # i位置到达了字符串最末尾且最后一个字符不在sep中时,把剩余字符串添加到列表中 result.append(s[start:]) # 将最后没有取走的字符串添加到result中 else: # 切割的字符使用的不是默认的空白值,而是指定的值 while i <= length: # 从0开始,到字符的最长位置之间做遍历 if s[i:i+len(sep)] == sep: # 判断当前坐标及其内容是否是分隔字符 # 是执行这个if代码 end = i # 将end设定为当前坐标 if maxsplit <0: # 根据split的规则,maxsplit小于0时,不限制切割次数 result.append(s[start:end]) # 将start和end之间的内容,放到结果list里面 elif maxsplit > 0: # 有切割次数的时候,且大于0时执行 result.append(s[start:end]) maxsplit -= 1 else: result.append(s[start:]) break start = i + len(sep) # 把start位置设定为分隔符后面的第一个字符位置 i = start else: # 从分隔符号后面的第一个字符位置继续遍历 i += 1 # 遍历下一个字符 if i > length: # i位置到达了字符串最末尾,把剩余字符串添加到列表中;如果不加此块代码,字符串后面几个字符不满足sep时,会被丢失 result.append(s[start:]) # 将最后没有取走的字符串添加到result中 return result # 返回结果if __name__ == '__main__': print(split(' I am a boy!', None, 2)) print(split('\tI am a \r\n\t boy! ', None, 14)) print(split('I am a \r\n\t boy! ', ' ', 7)) print(split('*I am a**boy!**', '*', 14))