2016-06-08 3 views
1

У меня есть некоторые проблемы, которые пытаются решить этот вопрос. Это экзамен на практике, и я просто не могу понять. Я должен написать функцию python, которая принимает строку и разделитель, и возвращает список обратно с линией, лишенной разделителя. Нам не разрешено использовать функцию split или «любую такую ​​функцию». Пример, который мы получили в этом вопросе был этот, возвращающий список строк, разделенных разделителем

StringToken("this is so fun! I love it!", "!") 

Выходы

["this is so fun", "I love it"] 

Это код, я сделал его супер просто.

def tokenizer(string, tmp): 
    newStr = [] 
    for i in range(len(string)): 
     if string[i] != tmp: 
      newStr.append(string[i]) 
    return newStr 

и выход этот

['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 's', 'o', ' ', 'f', 'u', 'n', ' ', 'I', ' ', 'l', 'o', 'v', 'e', ' ', 'i', 't']

Как я могу вернуться каждое слово?

+0

Вы хотите присоединиться к списку или исправить проблему выдачи отдельных символов? –

+0

Я думаю, исправить проблему вывода отдельных символов. То, что я пытался сделать, прежде чем задавать этот вопрос, это инициализировать newStr = ''. Затем я выполнил бы ту же проверку и, наконец, вернул [newStr]. Это дало мне результат [«Это так весело, что я люблю»], но поскольку я не могу использовать split. Я просто зациклился на том, как получить желаемый результат. – Qman485

+0

Правильно, поэтому вам нужно реализовать функцию split без использования split –

ответ

-1

Просто используйте оператор объединения, который объединит весь список с заданным разделителем. Здесь вы можете использовать пустой разделитель ''. попробовать:

a=['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 's', 'o', ' ', 'f', 'u', 'n', ' ', 'I', ' ', 'l', 'o', 'v', 'e', ' ', 'i', 't'] 
''.join(a) 

выход будет

'This is so fun I love it' 
3

Если объединить все элементы в списке вы получите одну строку, которая не может быть то, что вы ищете.

Создайте строку перед добавлением ее в список;

>>> def StringToken(string, tmp): 
    newStrlist = [] 
    newStr = '' 
    for i in range(len(string)): 
     if string[i] != tmp: 
      newStr += string[i] 
     elif newStr != '': 
      newStrlist.append(newStr) 
      newStr = '' 
    return newStrlist 
... ... ... ... ... ... ... ... ... ... 
>>> StringToken("this is so fun! I love it!", "!") 
['this is so fun', ' I love it'] 
+0

Любите его! Это то, что я искал. Я знал, что мне не хватает чего-то подобного, но я удивлен, что все так просто. Можете ли вы объяснить, почему вы устанавливаете newStr = '' в elif? Благодаря! Другое, тогда это имеет смысл! – Qman485

+0

иначе, после разделителя кулаков, новый charecter будет добавлен с первой строкой. Если вы не добавите его, то вывод будет: '['Это так весело', 'это так весело, я люблю его']'. – Praveen

+0

ohh ok. Таким образом, давая newStr = '', мы можем создать новый placeholder для строки [i], потому что если нет, то у нас будет первая строка! Делает полный смысл, приходилось думать об этом немного. Спасибо, что помогли новичкам :) – Qman485

0

Просмотреть комментарии в коде для описания.

def StringToken(string, tmp): 
    newStr = "" # A string to build upon 
    lst = []  # The list to return 
    for c in string: # Iterate over the characters 
     if tmp == c: # Check for the character to strip 
      if newStr != "": # Prevent empty strings in output 
       lst.append(newStr.strip()) # add to the output list 
       newStr = ""     # restart the string 
       continue      # move to the next character 
     newStr += c # Build the string 
    return lst # Return the list 

Выход

StringToken("this is so fun! I love it!", "!") 
# ['this is so fun', 'I love it'] 
0

Вместо прохода над всеми буквами в строке, вы можете использовать find, чтобы получить индекс следующего вхождения разделителя, а затем построить свой список соответственно:

def tokenizer(string, delim): 
    new_list = [] 
    while True: 
     index = string.find(delim) # use find to next occurrence of delimiter 
     if index > -1: 
      new_list.append(string[:index]) 
      string = string[index + len(delim):] 
     else: 
      new_list.append(string) 
      break    # break because there is no delimiter present anymore 

    # remove whitespaces and trim the existing strings 
    return [item.strip() for item in new_list if item.strip()] 

Использование:

>>> tokenizer("this is so fun! I love it!", "!") 
["this is so fun", "I love it"] 
0

Вот альтернатива, которая немного короче, чем текущие ответы:

def StringToken(string, tmp): 
    newStr = [] 
    start = 0 
    for ind, char in enumerate(string): 
     if char == tmp: 
      newStr.append(string[start:ind]) 
      start = ind + 1 
    return newStr 

Выходные

>>> StringToken("this is so fun! I love it!", "!") 
['this is so fun', ' I love it'] 

Edit: Если вы хотите, чтобы удалить начальные или конечные пробелы, как в вашем примере , которые могут быть выполнены с использованием полосы():

def StringToken(string, tmp): 
    newStr = [] 
    start = 0 
    for ind, char in enumerate(string): 
     if char == tmp: 
      newStr.append(string[start:ind].strip()) 
      start = ind + 1 
    return newStr 

>>> StringToken("this is so fun! I love it!", "!") 
['this is so fun', 'I love it'] 
Смежные вопросы