Was ist der Sinn der '/segment/segment/'.split('/')
Rückkehr ['', 'segment', 'segment', '']
?
Beachten Sie die leeren Elemente. Wenn Sie ein Trennzeichen aufteilen, das sich zufällig an Position eins und ganz am Ende einer Zeichenfolge befindet, welchen zusätzlichen Wert erhalten Sie, wenn die leere Zeichenfolge von jedem Ende zurückgegeben wird?
strip()
, führende und nachfolgende geteilte Zeichen vor dem Teilen von der Zeichenfolge zu'/segment/segment/'.strip('/').split('/')
Antworten:
str.split
ergänztstr.join
, soholt dir die ursprüngliche Saite zurück.
Wenn die leeren Zeichenfolgen nicht vorhanden
'/'
wären, würden die ersten und letzten nach dem fehlenjoin()
quelle
Um leere Zeichenfolgen zu entfernen, die in den
split()
Ergebnissen zurückgegeben werden, sollten Sie sich diefilter
Funktion ansehen .Beispiel:
kehrt zurück
quelle
list(...)
.Hier sind zwei Hauptpunkte zu beachten:
'/segment/segment/'.split('/')
gleich['segment', 'segment']
ist, aber dann gehen Informationen verloren. Wenn es sosplit()
funktioniert hat, wie Sie es wollten, wenn ich Ihnen das sage,a.split('/') == ['segment', 'segment']
können Sie mir nicht sagen, was esa
war.'a//b'.split()
sein?['a', 'b']
? oder['a', '', 'b']
? Dh, solltensplit()
benachbarte Begrenzer zusammengeführt werden? Wenn dies der Fall sein sollte, ist es sehr schwierig, Daten zu analysieren, die durch ein Zeichen begrenzt sind, und einige der Felder können leer sein. Ich bin ziemlich sicher , dass es viele Leute gibt , die nicht die leeren Werte im Ergebnis für den obigen Fall wollen!Am Ende läuft es auf zwei Dinge hinaus:
Konsistenz: Wenn ich
n
Trennzeichen habe,a
erhalte ichn+1
Werte nach demsplit()
.Es sollte möglich sein, komplexe und einfache Dinge zu tun: Wenn Sie leere Zeichenfolgen als Ergebnis von ignorieren möchten
split()
, können Sie immer Folgendes tun:aber wenn man die leeren Werte nicht ignorieren will, sollte man dazu in der Lage sein.
Die Sprache muss eine Definition auswählen: Es
split()
gibt zu viele verschiedene Anwendungsfälle, um standardmäßig alle Anforderungen zu erfüllen. Ich denke, dass Pythons Wahl eine gute und die logischste ist. (Abgesehen davon ist einer der Gründe, warum ich Cs nicht magstrtok()
, dass es benachbarte Trennzeichen zusammenführt, was es extrem schwierig macht, ernsthaftes Parsen / Tokenisieren damit durchzuführen.)Es gibt eine Ausnahme:
a.split()
Ohne Argument werden aufeinanderfolgende Leerzeichen zusammengedrückt, aber man kann argumentieren, dass dies in diesem Fall das Richtige ist. Wenn Sie das Verhalten nicht wollen, können Sie immera.split(' ')
.quelle
python3 -m timeit "import re ; re.sub(' +', ' foo bar baz ', '').split(' ')"
Folgendes : -> 875 ns pro Schleife;python3 -m timeit "[token for token in ' foo bar baz '.split(' ') if token]"
-> 616 ns pro SchleifeMit
x.split(y)
immer eine Liste von1 + x.count(y)
Artikel ist ein kostbares Regelmäßigkeit - wie @ gnibbler schon hat darauf hingewiesen , macht essplit
undjoin
genau invers zueinander ist (wie sie sollte offensichtlich sein), ist es auch Karten genau die Semantik aller Arten von Trennzeichen verbundenen Aufzeichnungen ( B.csv
Dateizeilen [[ohne Anführungszeichen]], Zeilen aus/etc/group
Unix usw., ermöglicht es (wie in der Antwort von @ Roman erwähnt) eine einfache Überprüfung auf (z. B.) absolute oder relative Pfade (in Dateipfaden und URLs). und so weiter.Eine andere Sichtweise ist, dass Sie Informationen nicht ohne Gewinn aus dem Fenster werfen sollten. Was würde man erreichen, wenn man
x.split(y)
gleichwertig wärex.strip(y).split(y)
? Nichts, natürlich - es ist einfach , die zweite Form zu verwenden , wenn das ist , was du meinst, aber wenn die erste Form willkürlich die zweiten verstanden wurde als würden Sie viel Arbeit zu tun , wenn Sie sich den ersten wollen ( was alles andere als selten ist, wie der vorige Absatz hervorhebt).Das Denken in mathematischer Regelmäßigkeit ist jedoch die einfachste und allgemeinste Methode, mit der Sie sich das Entwerfen passabler APIs beibringen können. Um ein anderes Beispiel zu nehmen, ist es sehr wichtig , dass für jeden gültig
x
undy
x == x[:y] + x[y:]
- die sofort anzeigt , warum eine Extrem ein Aufschneiden soll ausgeschlossen werden. Je einfacher die invariante Behauptung ist, die Sie formulieren können, desto wahrscheinlicher ist es, dass die resultierende Semantik das ist, was Sie im wirklichen Leben benötigen - ein Teil der mystischen Tatsache, dass Mathematik im Umgang mit dem Universum sehr nützlich ist.Versuchen Sie, die invariant für eine Formulierung
split
Dialekt , in dem vorderen und hinteren Begrenzungszeichen sind spezielle Gefasste ... Gegenbeispiel: String - Methoden wieisspace
nicht maximal einfach sind -x.isspace()
entsprichtx and all(c in string.whitespace for c in x)
- das dumme führendex and
ist , warum Sie so oft finden sich Codierungnot x or x.isspace()
, auf die Einfachheit zurück zu bekommen , die sollte in die entworfen wurden ,is...
String - Methoden (wobei ein leerer String „ist“ alles , was Sie wollen - im Gegensatz zu man-in-the-Straße Pferde Sinn, vielleicht [[leere Sätze, wie Null & c, haben die meisten Leute immer verwirrt ;-)]], aber voll und ganz dem offensichtlich gut verfeinerten mathematischen gesunden Menschenverstand entsprechend! -).quelle
Ich bin mir nicht sicher, nach welcher Antwort Sie suchen? Sie erhalten drei Übereinstimmungen, weil Sie drei Trennzeichen haben. Wenn Sie das nicht möchten, verwenden Sie einfach:
quelle
Nun, es lässt Sie wissen, dass es dort ein Trennzeichen gab. Wenn Sie also 4 Ergebnisse sehen, wissen Sie, dass Sie 3 Begrenzer hatten. Auf diese Weise können Sie mit diesen Informationen tun, was Sie möchten, anstatt Python die leeren Elemente löschen zu lassen und dann manuell nach Start- oder Endbegrenzern zu suchen, wenn Sie dies wissen müssen.
Einfaches Beispiel: Angenommen, Sie möchten nach absoluten und relativen Dateinamen suchen. Auf diese Weise können Sie alles mit dem Split erledigen, ohne auch das erste Zeichen Ihres Dateinamens überprüfen zu müssen.
quelle
Betrachten Sie dieses minimale Beispiel:
split
muss dir geben, was vor und nach dem Trennzeichen ist'/'
, aber es gibt keine anderen Zeichen. Es muss Ihnen also die leere Zeichenfolge geben, die technisch vor und nach der folgt'/'
, weil'' + '/' + '' == '/'
.quelle