Ich verwende split('\n')
, um Zeilen in einer Zeichenfolge abzurufen, und habe festgestellt, dass ''.split()
eine leere Liste zurückgegeben wird []
, während ''.split('\n')
zurückgegeben wird ['']
. Gibt es einen bestimmten Grund für einen solchen Unterschied?
Und gibt es eine bequemere Möglichkeit, Zeilen in einer Zeichenfolge zu zählen?
Antworten:
Die Methode str.split () verfügt über zwei Algorithmen. Wenn keine Argumente angegeben werden, wird es bei wiederholten Leerzeichenläufen aufgeteilt. Wenn jedoch ein Argument angegeben wird, wird es als ein einzelnes Trennzeichen ohne wiederholte Läufe behandelt.
Wenn Sie eine leere Zeichenfolge aufteilen, gibt der erste Modus (kein Argument) eine leere Liste zurück, da das Leerzeichen gegessen wird und keine Werte in die Ergebnisliste aufgenommen werden müssen.
Im Gegensatz dazu erzeugt der zweite Modus (mit einem Argument wie
\n
) das erste leere Feld. Überlegen Sie, wenn Sie geschrieben hätten'\n'.split('\n')
, würden Sie zwei Felder erhalten (ein Split ergibt zwei Hälften).Dieser erste Modus ist nützlich, wenn Daten in Spalten mit variablen Leerzeichen ausgerichtet werden. Beispielsweise:
Der zweite Modus ist nützlich für begrenzte Daten wie CSV, bei denen wiederholte Kommas leere Felder bezeichnen. Beispielsweise:
Beachten Sie, dass die Anzahl der Ergebnisfelder um eins größer ist als die Anzahl der Begrenzer. Denken Sie daran, ein Seil zu schneiden. Wenn Sie keine Schnitte machen, haben Sie ein Stück. Wenn Sie einen Schnitt machen, erhalten Sie zwei Stücke. Wenn Sie zwei Schnitte machen, erhalten Sie drei Stücke. Und so ist es auch mit Pythons str.split (Trennzeichen) -Methode:
Ja, es gibt einige einfache Möglichkeiten. Einer verwendet str.count () und der andere str.splitlines () . Beide Methoden geben die gleiche Antwort, es sei denn, in der letzten Zeile fehlt die
\n
. Wenn die letzte neue Zeile fehlt, gibt der str.splitlines- Ansatz die genaue Antwort. Eine schnellere Technik, die ebenfalls genau ist, verwendet die Zählmethode, korrigiert sie dann jedoch für die endgültige neue Zeile:Die Signatur für str.split ist ungefähr 20 Jahre alt, und einige der APIs aus dieser Zeit sind streng pragmatisch. Die Methodensignatur ist zwar nicht perfekt, aber auch nicht "schrecklich". Die API-Designentscheidungen von Guido haben sich größtenteils bewährt.
Die aktuelle API ist nicht ohne Vorteile. Betrachten Sie Zeichenfolgen wie:
Wenn Leute gebeten werden, diese Zeichenfolgen in Felder zu unterteilen, beschreiben sie beide mit demselben englischen Wort "split". Wenn Benutzer aufgefordert werden, Code wie
fields = line.split()
oder zu lesenfields = line.split(',')
, interpretieren sie die Anweisungen in der Regel korrekt als "Aufteilen einer Zeile in Felder".Das Text-zu-Spalten-Tool von Microsoft Excel hat eine ähnliche API-Auswahl getroffen und beide Aufteilungsalgorithmen in dasselbe Tool integriert. Menschen scheinen die Feldaufteilung mental als ein einziges Konzept zu modellieren, obwohl mehr als ein Algorithmus beteiligt ist.
quelle
Laut Dokumentation scheint es einfach so zu sein, wie es funktionieren soll :
Um es klarer zu machen,
split()
implementiert die Funktion zwei verschiedene Aufteilungsalgorithmen und verwendet das Vorhandensein eines Arguments, um zu entscheiden, welcher ausgeführt werden soll. Dies kann daran liegen, dass das für mehr Argumente als das mit Argumenten optimiert werden kann. Ich weiß es nicht.quelle
.split()
ohne Parameter versucht klug zu sein. Es teilt sich in Leerzeichen, Tabulatoren, Leerzeichen, Zeilenvorschübe usw. auf und überspringt dadurch auch alle leeren Zeichenfolgen.Im Wesentlichen werden
.split()
ohne Parameter Wörter aus einer Zeichenfolge extrahiert, im Gegensatz zu.split()
Parametern, bei denen nur eine Zeichenfolge verwendet und aufgeteilt wird.Das ist der Grund für den Unterschied.
Und ja, das Zählen von Linien durch Teilen ist kein effizienter Weg. Zählen Sie die Anzahl der Zeilenvorschübe und fügen Sie einen hinzu, wenn die Zeichenfolge nicht mit einem Zeilenvorschub endet.
quelle
Verwendung
count()
:quelle
cat file
verstümmelt sich Ihre Befehlszeile und Subversion beschwert sich. vi fügt immer einen an.Beachten Sie den letzten Satz.
Um Zeilen zu zählen, können Sie einfach zählen, wie viele
\n
es gibt:Der letzte Teil berücksichtigt die letzte Zeile , die mit nicht enden
\n
, auch wenn dies bedeutet , dassHello, World!
undHello, World!\n
die gleiche Zeilenzahl hat (was für mich sinnvoll ist), ansonsten können Sie fügen Sie einfach1
auf die Zahl\n
.quelle
Um Zeilen zu zählen, können Sie die Anzahl der Zeilenumbrüche zählen:
Bearbeiten :
Die andere Antwort mit eingebautem
count
ist eigentlich besser geeignetquelle
count
bloßen Verwendung können Bools hinzugefügt werden (tatsächlich sind sie Unterklassenint
), sodass das Genexp als geschrieben werden kannsum(s == "\n" for s in the_string)
.