2012-05-30 16 views
6

Problem: Zerlegen einer Zeichenfolge in eine Liste von Wörtern durch Begrenzungszeichen, die als Liste übergeben werden.string split Ausgabe

String: "After the flood ... all the colors came out."

gewünschte Ausgabe: ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']

ich die folgende Funktion geschrieben haben - beachten Sie, ich weiß, dass es bessere Möglichkeiten gibt, eine Zeichenfolge mit einigen von Pythons eingebauten Funktionen zu spalten, sondern aus Gründen der Lernen ich dachte, ich auf diese Weise vorgehen würde:

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', '', '', '', '', '', '', '', '', ''] 

ich kann nicht herausfinden, warum „herauskam“ aufgespalten wird nicht in „gekommen“ und „out“ als zwei getrennte Wörter. Es ist so, als ob der Leerraum zwischen den beiden Wörtern ignoriert wird. Ich denke, dass der Rest der Ausgabe Junk ist, der von dem Problem herrührt, das mit dem "herausgekommenen" Problem verbunden ist.

EDIT:

I @ IVc Vorschlag gefolgt und kam mit dem folgenden Code auf:

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'] 

Antwort

2

Sie scheinen erwartet zu werden:

source = tmp[start:] 

die source, dass die äußere for-Schleife iteriert über zu ändern. Es wird nicht - diese Schleife wird über die Zeichenfolge weitergehen, die Sie ihr gegeben haben, nicht das Objekt, das jetzt diesen Namen verwendet. Dies kann bedeuten, dass der Charakter, den du gerade machst, nicht in dem ist, was von source übrig ist.

Anstatt zu versuchen, das zu tun, den Überblick über den aktuellen Index in der Zeichenfolge auf diese Weise:

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

und was Sie Anfügen source[lasti+1:i] immer sein wird, und Sie brauchen nur den Überblick über lasti zu halten .

+1

Vielen Dank für die wunderbaren Lösungen. Ich bin damit gegangen, weil es mich zwingt, die Logik zu lernen, anstatt vorgefertigte Funktionen zu verwenden. Offensichtlich würde ich das Rad nicht neu erfinden, wenn ich kommerziellen Code schreiben würde, aber für Lernzwecke werde ich mit dieser Antwort gehen. Danke Ihnen allen für Ihre Hilfe. – codingknob

3

Sie brauchen nicht die innere Schleife Anruf. Genau das ist genug:

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 

Sie können die „Junk“ beseitigen (das heißt, die leere Zeichenkette), durch Prüfen, ob Quelle [: Ende] eine leere Zeichenfolge ist oder nicht, bevor Sie es in die Liste anhängen.

0

Warum zu viele Dinge zu tun, Gerade diese einfache, versuchen ..
str.split(strSplitter , intMaxSplitCount)intMaxSplitCount ist optional
In Ihrem Fall, du musst etwas Houskeeping zu tun, wenn Sie vermeiden wollen ... ein nur

so kurz ist, dass Sie es, wie str.replace(".","", 3)3 ist optional ersetzen kann, wird es zuerst 3 Punkte ersetzen du musst folgende tun,
print ((str.replace(".", "",3)).split(" ")) es druckt, was Sie

gewünschten I Ausführung, Just Check Here,...

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

Hier machte 'a' ist Ihr Eingabestring.

0

Eine einfachere Art und Weise, sieht zumindest einfacher ..

import string 

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

Sie string.maketrans und string.translate

2

Kasse kann ich denke, wenn man regex verwenden, können Sie es leicht, wenn man nur die Wörter in die wollen String oben angegeben.

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