Wie mache ich das, was strtok () in C tut, in Python?

7

Ich lerne Python und versuche, einen effizienten Weg zu finden, um eine durch Kommas getrennte Zeichenkette in eine Liste zu tokenisieren. Gut ausgebildete Fälle funktionieren wie ich es erwarte, aber weniger gut geformte Fälle nicht so sehr.

Wenn ich das habe:

%Vor%

was ich erwarte, aber wenn die Zeichenfolge etwas mehr wie

ist %Vor%

Wenn ich den gleichen Listenverständnisausdruck für B wie oben verwende, bekomme ich eine Ausnahme. Ich denke, ich verstehe warum (weil einige der "x" Zeichenfolgenwerte keine Ganzzahlen sind), aber ich denke, dass es eine Möglichkeit geben würde, dies noch recht elegant zu analysieren, so dass die Tokenisierung der Zeichenfolge ein bisschen direkter wirkt strtok (A, ", \ n \ t") hätte getan, wenn iterativ in C aufgerufen wird.

Um klar zu sein, was ich verlange; Ich suche nach einem eleganten / effizienten / typischen Weg in Python, um alle folgenden Beispielfälle von Strings zu haben:

%Vor%

geben Sie mit derselben Liste von:

zurück %Vor%

über eine Art kompakten Ausdruck.

    
Tall Jeff 18.01.2009, 23:03
quelle

9 Antworten

27

Wie wäre es damit:

%Vor%

x.strip () trimmt Leerzeichen aus der Zeichenfolge, wodurch es leer wird, wenn die Zeichenfolge nur Leerzeichen enthält. Eine leere Zeichenfolge ist in einem booleschen Kontext "false", daher wird sie nach dem if-Teil des Listenverständnisses gefiltert.

    
Dave Ray 18.01.2009, 23:09
quelle
4

Mmm, funktionale Güte (mit ein wenig Generatorausdruck):

%Vor%

Für volle funktionelle Freude:

%Vor%     
Alec Thomas 19.01.2009 02:54
quelle
3

Im Allgemeinen versuche ich, reguläre Ausdrücke zu vermeiden, aber wenn Sie sich auf eine Menge verschiedener Dinge aufteilen wollen, arbeiten sie. Versuchen Sie Folgendes:

%Vor%     
Nick 19.01.2009 01:54
quelle
1

Dies wird funktionieren und niemals eine Ausnahme auslösen, wenn alle Zahlen int sind. Der isdigit() -Aufruf ist falsch, wenn in der Zeichenfolge ein Dezimalpunkt vorhanden ist.

%Vor%     
runeh 18.01.2009 23:41
quelle
1

Wie wäre es damit?

%Vor% Der Filter

entfernt alle falschen Werte (d. h. leere Zeichenfolgen), die dann auf int.

abgebildet werden

BEARBEITEN: Habe es gerade mal mit den oben geposteten Versionen getestet, und es scheint wesentlich schneller zu sein, 15% oder so verglichen mit dem strip () ein und mehr als doppelt so schnell wie das isdigit () eins

    
Algorias 19.01.2009 01:49
quelle
1

Warum sollten Sie minderwertige Substitute akzeptieren, die Ihren Interpreter nicht segregieren können? Mit Ctypes können Sie einfach das echte Ding nennen! : -)

%Vor%     
joeforker 19.01.2009 16:43
quelle
1

Der Vollständigkeit halber werde ich diese sieben Jahre alte Frage beantworten: Das C-Programm, das strtok verwendet:

%Vor%

kann in python mit re.split als:

ausgeführt werden %Vor%     
user1683793 16.10.2016 14:55
quelle
0

Warum nicht einfach in einen Versuch einbinden außer Block, der alles fängt, nicht eine ganze Zahl?

    
Josh Smeaton 19.01.2009 02:50
quelle
-1

Ich würde vermuten, dass reguläre Ausdrücke der richtige Weg sind: Ссылка

    
Simon Groenewolt 18.01.2009 23:12
quelle

Tags und Links