如何在不使用.split和.strip函数的情况下编写自己的split函数?

时间:2018-09-25 10:25:29

标签: python python-3.x

如何编写自己的分割函数?我只是认为我应该删除空格'\t''\n'。但是由于知识不足,我不知道要回答这个问题

这是原始问题:

  

编写一个函数split(string),该函数返回列表中的单词列表   给定的字符串。单词可以用一个或多个空格' '和制表符分隔   '\t'或换行符'\n'

     

还有例子:

words = split('duff_beer 4.00') # ['duff_beer', '4.00']
words = split('a b c\n') # ['a', 'b', 'c']
words = split('\tx y \n z ') # ['x', 'y', 'z']
     

限制:请勿使用str.split方法!不要使用str.strip方法

9 个答案:

答案 0 :(得分:4)

我认为使用正则表达式也是最好的选择。

我会尝试这样的事情:

import re
def split(string):
    return re.findall('\S+',string)

这应该返回字符串中所有无空格字符的列表。

示例输出:

>>> split('duff_beer 4.00')
['duff_beer', '4.00']
>>> split('a b c\n')
['a', 'b', 'c']
>>> split('\tx y \n z ')
['x', 'y', 'z']

答案 1 :(得分:3)

关于您的问题的一些评论提供了非常有趣的想法,可以解决给定的限制问题。

但是假设您不应该使用任何python内置的split函数,这是另一种解决方案:

def split(string, delimiters=' \t\n'):
    result = []
    word = ''
    for c in string:
        if c not in delimiters:
            word += c
        elif word:
            result.append(word)
            word = ''

    if word:
        result.append(word)

    return result

示例输出:

>>> split('duff_beer 4.00')
['duff_beer', '4.00']
>>> split('a b c\n')
['a', 'b', 'c']
>>> split('\tx y \n z ')
['x', 'y', 'z']

答案 2 :(得分:2)

这就是分配列表所能做的,已在python3.6上进行了测试

下面只是一个例子。

values = 'This is a sentence'
split_values = []
tmp  = ''
for words in values:
    if words == ' ':
        split_values.append(tmp)
        tmp = ''
    else:
        tmp += words
if tmp:
    split_values.append(tmp)
print(split_values)

所需的输出:

$ ./splt.py
['This', 'is', 'a', 'sentence']

答案 3 :(得分:2)

您可以使用以下基本功能,就像您的教授喜欢的那样:

def split(s):
    output = []
    delimiters = {' ', '\t', '\n'}
    delimiter_found = False
    for c in s:
        if c in delimiters:
            delimiter_found = True
        elif output:
            if delimiter_found:
                output.append('')
                delimiter_found = False
            output[-1] += c
        else:
            output.append(c)
    return output

这样:

print(split('duff_beer 4.00'))
print(split('a b c\n'))
print(split('\tx y \n z '))

将输出:

['duff_beer', '4.00']
['a', 'b', 'c']
['x', 'y', 'z']

答案 4 :(得分:2)

一种方法是遍历每个字符,直到找到一个分隔符,从这些字符中构建一个字符串,然后将其附加到输出列表中,如下所示:

def split(input_str):
    out_list = []
    word = ""
    for c in input_str:
        if c not in ("\t\n "):
            word += c
        else:
            out_list.append(word)
            word = ""
    out_list.append(word)
    return out_list

a = "please\nsplit\tme now"
print(split(a))

# will print: ['please', 'split', 'me', 'now']

您可以做的另一件事是使用正则表达式:

import re

def split(input_str):
    out_list = []
    for m in re.finditer('\S+', input_str):
        out_list.append(m.group(0))

    return out_list

a = "please\nsplit\tme now"
print(split(a))

# will print: ['please', 'split', 'me', 'now']

正则表达式\S+正在查找任何非空格字符序列,并且函数re.finditer返回一个带有MatchObject实例的迭代器,该迭代器包含正则表达式模式的所有非重叠匹配。

答案 5 :(得分:1)

请找到我的解决方案,它不是最好的解决方案,但它可行:

def convert_list_to_string(b):
    localstring=""
    for i in b:
        localstring+=i
    return localstring

def convert_string_to_list(b):
    locallist=[]
    for i in b:
        locallist.append(i)
    return locallist

def mysplit(inputString, separator):
    listFromInputString=convert_string_to_list(inputString)
    part=[]
    result=[]
    j=0
    for i in range(0, len(listFromInputString)):
        if listFromInputString[i]==separator:
            part=listFromInputString[j:i]
            j=i+1
            result.append(convert_to_string(part))
        else:
            pass
    if j != 0:
        result.append(convert_to_string(listFromInputString[j:]))
    if len(result)==0:
        result.append(inputString)
    return result

测试:

mysplit("deesdfedefddfssd", 'd')

结果:['','ees','fe','ef','','fss','']

答案 6 :(得分:0)

您的某些解决方案非常好,但在我看来,还有比使用该功能更多的选择:

values = 'This is a sentence'
split_values = []
tmp = ''
for words in values:
    if words == ' ':
        split_values.append(tmp)
    tmp = ''
else:
    tmp += words
if tmp:
    split_values.append(tmp)
    print(split_values)

答案 7 :(得分:0)

a是字符串,s是模式。

a="Tapas Pall Tapas TPal TapP al Pala"
s="Tapas"
def fun(a,s):
  st=""
  l=len(s)
  li=[]
  lii=[]
  for i in range(0,len(a)):
      if a[i:i+l]!=s:
        st=st+a[i]
    elif i+l>len(a):
        st=st+a[i]
    else:
        li.append(st)
        i=i+l
        st=""
  li.append(st)
  lii.append(li[0])
  for i in li[1:]:
      lii.append(i[l-1:])
  return lii
print(fun(a,s))
print(a.split(s))    

答案 8 :(得分:0)

<块引用>

处理字符串中的空格并返回空列表(如果存在)

def mysplit(strng):
    #
    # put your code here
    #
    result = []
    words = ''
    
    for char in strng:
        if char != ' ':
            words += char
        else:
            if words:
                result.append(words)
            words = ''
            
            
    result.append(words)
    
    for item in result:
        if item == '':
            result.remove(item)
    
    return result

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(""))