2012-05-30 3 views
6

Проблема: разделите строку на список слов разделителями символов, переданных в виде списка.string split issue

Строка: "After the flood ... all the colors came out."

Желаемый результат: ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']

Я написал следующую функцию - обратите внимание, я знаю, что есть лучшие способы разбить строку, используя некоторые из питонов встроенных функций, но ради обучения я думал, что будет продолжаться так:

def split_string(source,splitlist): 
    result = [] 
    for e in source: 
      if e in splitlist: 
       end = source.find(e) 
       result.append(source[0:end]) 
       tmp = source[end+1:] 
       for f in tmp: 
        if f not in splitlist: 
         start = tmp.find(f) 
         break 
       source = tmp[start:] 
    return result 

out = split_string("After the flood ... all the colors came out.", " .") 

print out 

['After', 'the', 'flood', 'all', 'the', 'colors', 'came out', '', '', '', '', '', '', '', '', ''] 

Я не могу понять, почему «вышел» не разделяется на «пришел» и «из», как два отдельных слова. Его как будто пробельный символ между двумя словами игнорируется. Я думаю, что остальная часть вывода - это хлам, который связан с проблемой, связанной с проблемой «вышла».

EDIT:

Я последовал @ предложение IVC и придумал следующий код:

def split_string(source,splitlist): 
    result = [] 
    lasti = -1 
    for i, e in enumerate(source): 
     if e in splitlist: 
      tmp = source[lasti+1:i] 
      if tmp not in splitlist: 
       result.append(tmp) 
      lasti = i 
     if e not in splitlist and i == len(source) - 1: 
      tmp = source[lasti+1:i+1] 
      result.append(tmp) 
    return result 

out = split_string("This is a test-of the,string separation-code!"," ,!-") 
print out 
#>>> ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code'] 

out = split_string("After the flood ... all the colors came out.", " .") 
print out 
#>>> ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out'] 

out = split_string("First Name,Last Name,Street Address,City,State,Zip Code",",") 
print out 
#>>>['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code'] 

out = split_string(" After the flood ... all the colors came out...............", " ." 
print out 
#>>>['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out'] 

ответ

2

Вы, кажется, ожидает:

source = tmp[start:] 

Чтобы изменить source, что внешний цикл является итерация. Это не будет - этот цикл будет продолжать перебирать строку, которую вы ему дали, а не какой-либо объект теперь использует это имя. Это может означать, что персонаж, в котором вы находитесь, может быть не в том, что осталось от source.

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

for i, e in enumerate(source): 
    ... 

и что вы всегда будете, добавить свои source[lasti+1:i] быть, и вам просто нужно следить за lasti ,

+1

Благодарим вас за прекрасные решения. Я пошел с этим, потому что он заставляет меня изучать логику вместо использования предварительно построенных функций. Очевидно, что если бы я написал коммерческий код, я бы не изобрел колесо, но для учебных целей я пойду с этим ответом. Спасибо за вашу помощь. – codingknob

3

Вам не нужен вызов внутреннего цикла. Только этого достаточно:

def split_string(source,splitlist): 
    result = [] 
    for e in source: 
      if e in splitlist: 
       end = source.find(e) 
       result.append(source[0:end]) 
       source = source[end+1:] 
    return result 

Вы можете устранить «мусор» (то есть, пустая строка), проверяя, если источник [: конец] является пустая строка или нет, прежде чем добавить его в список.

0

Почему делать слишком много вещей, Просто это просто, попробуйте ..
str.split(strSplitter , intMaxSplitCount)intMaxSplitCount является необязательным
В вашем случае, вам нужно сделать некоторые Houskeeping тоже, если вы хотите избежать ... один что вы можете заменить его, как str.replace(".","", 3)3 не является обязательным, он заменит первые 3 точки только

так короче вам нужно сделать следующее,
print ((str.replace(".", "",3)).split(" ")) он будет печатать то, что вы хотели

Я сделал исполнение, Just Check Here,...

0
[x for x in a.replace('.', '').split(' ') if len(x)>0] 

Здесь «а» ваша строка ввода.

0

Более простой способ, по крайней мере, выглядит проще ..

import string 

    def split_string(source, splitlist): 
     table = string.maketrans(splitlist, ' ' * len(splitlist)) 
     return string.translate(source, table).split() 

Вы можете оформить string.maketrans и string.translate

2

Я думаю, что если вы используете регулярное выражение, вы можете легко получить его, если вы хотите только слова в строка, указанная выше.

>>> import re 
>>> string="After the flood ... all the colors came out." 
>>> re.findall('\w+',string) 
['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']