2012-06-01 13 views
10

Ich möchte eine Zeichenfolge durch eine Liste von Indizes aufteilen, wobei die geteilten Segmente mit einem Index beginnen und vor dem nächsten enden.Zerlegen einer Zeichenfolge nach einer Liste von Indizes

Beispiel:

s = 'long string that I want to split up' 
indices = [0,5,12,17] 
parts = [s[index:] for index in indices] 
for part in parts: 
    print part 

Dies wird zurück:

lange Zeichenfolge, die ich will aufzuspalten
Zeichenfolge, die ich will aufzuspalten
, die ich möchte Aufteilen
Ich möchte aufteilen

Ich versuche zu bekommen:

lange
String
dass
Ich möchte aufzuspalten

Antwort

15
s = 'long string that I want to split up' 
indices = [0,5,12,17] 
parts = [s[i:j] for i,j in zip(indices, indices[1:]+[None])] 

kehrt

['long ', 'string ', 'that ', 'I want to split up'] 

, die Sie mit ausdrucken:

print '\n'.join(parts) 

Einem weiteren Möglichkeit (ohne indices Kopieren) wäre:

s = 'long string that I want to split up' 
indices = [0,5,12,17] 
indices.append(None) 
parts = [s[indices[i]:indices[i+1]] for i in xrange(len(indices)-1)] 
+1

Ein anderer Weg ist, '[s [i: j] für i, j in izip_longest (Indizes, Indizes [1:]))] aber ich mag deinen Weg besser! – jamylak

+0

Dies kopiert die Indexliste mit 'indices [1:]' und erstellt eine neue Liste mit doppelter Größe durch die 'zip' Funktion -> Schlechte Performance und Speicherverbrauch. – schlamar

+2

@ ms4py Das ist gut, Leistung ist in diesem Fall kein Problem, das ist eine sehr lesbare Lösung. Wenn Leistung ein Problem ist, kann mein Vorschlag verwendet werden. – jamylak

3

Hier ist eine kurze Lösung mit starken Nutzung der itertools module. Die tee-Funktion wird verwendet, um paarweise über die Indizes zu iterieren. Weitere Informationen finden Sie im Abschnitt Rezept im Modul.

>>> from itertools import tee, izip_longest 
>>> s = 'long string that I want to split up' 
>>> indices = [0,5,12,17] 
>>> start, end = tee(indices) 
>>> end.next() 
0 
>>> [s[i:j] for i,j in izip_longest(start, end)] 
['long ', 'string ', 'that ', 'I want to split up'] 

bearbeiten: Dies ist eine Version, die nicht die Indizes Liste kopiert, so dass es schneller sein sollte.

+0

Danke für die alt-Ansatz- If müssen Itimerools einmal überprüfen – Yarin

+0

Gepflegte Annäherung, lernte etwas Neues. Gibt es eine einfache Möglichkeit, das zusätzliche Leerzeichen am Ende der ersten 3 Zeichenfolgen im Ausdruck loszuwerden? Ich habe versucht 's [i: j] .strip()' aber das hat überhaupt nicht funktioniert (nicht sicher, warum nicht) – Levon

+0

Wenn Sie dies verwenden, können Sie auch die paarweise Funktion direkt aus den itertools docs verwenden. Auch die Verwendung von 'next (end)' wird für die Kompatibilität mit python 3 gegenüber 'end.next()' bevorzugt. – jamylak

Verwandte Themen