2016-03-22 3 views
1

splitText (текст), где текст является строкой и возвращает список слов, разделяя строку текст. Смотрите пример ниже:Проблема разделения текста без использования раскола()

sampleText = «Как создатель Python, я хотел бы сказать несколько слов о его происхождении«.

splitText (sampleText)

[» Как ',' Python ',' s ',' creator ',' I ',' d ',' like ',' to ',' say ',' a ',' few ',' words ',' about ' , 'его', 'происхождение']

Вы не должны использовать метод split() из типа str, однако допускаются другие методы> из класса. Вы не должны использовать библиотеку python, такую ​​как string.py.

Это мой код:

def split(text): 
    final_lst = "" 
    length = len(text) 
    for x in range(length): 
     if text[x].isalpha() == True: 
      final_lst = final_lst + text[x] 
     else: 
      final_lst = final_lst + ", " 

    final_len = len(final_lst) 
    for a in range(final_len): 
     if final_lst[:a] == " " or final_lst[:a] == "": 
      final_lst = "'" + final_lst[a] 
     if final_lst[a:] == " " or final_lst[a:] == ", ": 
      final_lst = final_lst[a] + "'" 
     elif final_lst[:a].isalpha() or final_lst[a:].isalpha(): 
      final_lst[a] 


    print(final_lst) 

split(sampleText) 

Когда я запускаю его я получаю это:

«A

Я пробовал много вещей, чтобы попытаться решить.

+0

упражнение не слишком ясно, на какие символы строка должна быть разделена (по-видимому, не на «»), и это выглядит как соседние символы разделения не должны быть разделены (запятая -пространственная последовательность не вводит пустую строку). – Evert

+1

@Evert Вы не имеете в виду «Сделать final_lst = [] пустым списком»? – whitebeard

+0

@whitebeard: правильный, скольжение клавиатуры. Поскольку я вышел за пределы периода отмены редактирования, добавив исправленный комментарий заново. – Evert

ответ

2

Прежде всего, ваше имя функции неверно. У вас есть split(text), и упражнение специально вызывает splitText(text). Если ваш класс оценивается автоматически, например, программой, которая просто загружает ваш код и пытается запустить splitText(), вы потерпите неудачу.

Далее, вам будет полезно узнать, что строка является итерируемым объектом в Python. Вам не нужно использовать индекс - просто перебирайте символы непосредственно.

for ch in text: 

Далее, как отметил @Evert, вы пытаетесь создать список, а не строку.Поэтому использовать правильный синтаксис Python:

final_list = [] 

Далее, давайте подумаем о том, как вы можете обработать один символ за один раз и получить это сделать. Когда вы видите символ, вы можете определить, является ли он алфавитным символом или нет. Вам нужна еще одна информация: что вы делали раньше?

  • Если вы находитесь в «слове», и вы получите «больше слова», вы можете просто добавить его.

  • Если вы находитесь в «слове», и вы получаете слово «не слово», вы достигли конца слова и должны добавить его в свой список.

  • Если вы находитесь в «ни слова», и вы получаете слово «не слово», вы можете просто игнорировать его.

  • Если вы находитесь в «ни слова», и вы получаете «слово», это начало нового слова.

Теперь, как вы можете сказать, являетесь ли вы одним словом или нет? Просто. Сохраните переменную слова.

def splitText(text): 
    """Split text on any non-alphabetic character, return list of words.""" 
    final_list = [] 
    word = '' 

    for ch in text: 
     if word: # Empty string is false! 
      if ch.isalpha(): 
       word += ch 
      else: 
       final_list.append(word) 
       word = '' 
     else: 
      if ch.isalpha(): 
       word += ch 
      else: 
       # still not alpha. 
       pass 

    # Handle end-of-text with word still going 
    if word: 
     final_list.append(word) 

    return final_list 

sampleText = "As Python's creator, I'd like to say a few words about its origins." 
print(splitText(sampleText)) 

Выход:

[ 'Как', 'Python', 'с', 'творца', 'I', 'D', 'как', 'к', ' скажем ',' a ',' few ',' words ',' about ',' its ',' originins ']

Далее, если вы сидите и смотрите на него некоторое время, вы поймете, что вы можете комбинировать некоторые из этих случаев. Он сваривается красиво - поверните его наизнанку, перемещая внешнее, если внутрь, и посмотрите, что вы получите.

+2

Хороший подробный ответ. Одна из проблем, которую я думаю (и все остальные сделали это тоже), заключается в том, что вы не обрабатываете строку, заканчивающуюся словом и разделителем. –

+0

Исправлено, спасибо ... –

1

Для меня это похоже, что вы слишком много усложняете, в основном все, что вам нужно сделать, - это пройти через символ char по символу и объединить их со словами, как только вы найдете пустое пространство, которое вы его отделите, и добавьте его к массиву результатов. После того, как вы закончите текст, вы просто вернете массив.

def splittext(text): 
    result = [] 
    word = "" 
    for i in text: 
     if i != " ": 
      word += i 
     else: 
      result.append(word) 
      word = "" 
    result.append(word) 
    return result 
+0

Это не учитывает апострофы, которые, как ясно указывает пример, также должны быть точкой разделения. – whitebeard

+0

Вы должны использовать 'if not i.isalpha()'. – zondo

1

Это должно работать:

smapleText = 'Как Python \' s создатель, я \ хотел бы сказать несколько слов о его происхождении.

def split(text): 
    result =[] 
    temp="" 
    length = len(text) 
    for x in range(length): 
     if text[x].isalpha(): 
     temp = temp+text[x] 
     else: 
     result.append(temp) 
     temp="" 

     print result 

split(smapleText) 
+2

Рассмотрите, что произойдет, если текст содержит два не-альфа-символа. (Как знак препинания и цитата.) –

+1

Я только что сделал шаг в решении проблемы. Он должен будет выполнить лексический анализ согласно требованию. – denis

0

Можете ли вы обмануть регулярными выражениями?

import re 
sampleText = "As Python's creator, I'd like to say a few words about its origins." 
result = re.findall(r'\w+', sampleText) 

>>> result 
['As', 'Python', 's', 'creator', 'I', 'd', 'like', 'to', 'say', 'a', 'few', 'words', 'about', 'its', 'origins'] 
0
def stringSplitter(string): 
    words = [] 
    current_word = "" 
    for x in range(len(string)): 
     if string[x] == " ": 
      words.append(current_word) 
      current_word = "" 
     else: 
      current_word += string[x] 
    return words