2017-02-14 2 views
1

Warum entfernt str.split() Noney-Elemente, während str.split ('') nicht?Warum entfernt str.split() Noney-Elemente, während str.split ('') nicht?

>>> s = 'this is an irritating string with random spacing .' 
>>> s.strip().split(' ') 
['this', 'is', '', '', 'an', '', '', 'irritating', 'string', 'with', '', 'random', 'spacing', '', '.'] 
>>> s.strip().split() 
['this', 'is', 'an', 'irritating', 'string', 'with', 'random', 'spacing', '.'] 

Nach dem docs:

str.split (sep = None, maxsplit = -1)

Wenn September angegeben wird, werden aufeinanderfolgende Trennzeichen nicht zusammen gruppiert und Es wird angenommen, dass leere Zeichenfolgen abgegrenzt werden (z. B. '1,, 2' .split (',') gibt ['1', '', '2']) zurück. Das Argument sep kann aus mehreren Zeichen bestehen (z. B. '1 <> 2 <> 3'.split (' <> ') gibt [' 1 ',' 2 ',' 3 '] zurück). Wenn Sie eine leere Zeichenfolge mit einem angegebenen Trennzeichen trennen, wird [''] zurückgegeben.

Wenn sep nicht angegeben ist oder None, wird ein anderer Aufteilungsalgorithmus angewendet: Läufe von aufeinander folgenden Leerzeichen werden als einzelnes Trennzeichen betrachtet, und das Ergebnis enthält keine leeren Zeichenfolgen am Anfang oder Ende, wenn die Zeichenfolge vorangestellt ist nachgestellte Leerzeichen. Wenn Sie also eine leere Zeichenfolge oder eine Zeichenfolge bestehend aus nur Leerzeichen mit einem Trennzeichen None aufteilen, wird [] zurückgegeben.

So zu verwenden, um das Schlüsselwort-Argument sep=, das ist nach dem pythonic Weg, um die Noney Elemente entfernen?

[w for w in s.strip().split(' ') if w] 

Wenn es nur Leerzeichen ist (\s\t\n), str.split() genügen lässt aber sagen, dass wir auf einem anderen Zeichen/String, die if-Bedingung in der Liste Verständnis zu spalten versuchen, ist notwendig. Ist das richtig?

+0

Keines ist kein Leerzeichen. Ich weiß nicht einmal, was Noney bedeutet, aber die Methode funktioniert wie dokumentiert. Sie haben keine None-Elemente in einer Zeichenfolge –

+2

Warum nicht einfach 'split()' verwenden? Außerdem, was versuchst du eigentlich zu tun? –

+0

Randbemerkung: Wenn Sie no-arg 'split' verwenden, ist der erste Aufruf von' strip' redundant; Die 'split'-Operation entfernt bereits den führenden und nachfolgenden Whitespace, ohne einen zusätzlichen Methodenaufruf und ein temporäres' str' hinzuzufügen. – ShadowRanger

Antwort

1

Wenn Sie stumpf sein wollen, könnten Sie filter(None, x) verwenden Falsey Elemente zu entfernen:

>>> list(filter(None, '1,2,,3,'.split(','))) 
['1', '2', '3'] 

Wahrscheinlich weniger Pythonic. Es könnte klarer sein speziell um die Elemente zu iterieren:

for w in '1,2,,3,'.split(','): 
    if w: 
     … 

Dies macht deutlich, dass Sie die leeren Elemente sind Skipping und nicht darauf verlassen, dass str.split manchmal leer Elemente überspringt.

Ich würde nur so schnell einen regulären Ausdruck verwenden, entweder aufeinanderfolgende Durchläufe des Separators (aber achten Sie auf Ende) überspringen:

>>> re.split(r',+', '1,2,,3,') 
['1', '2', '3', ''] 

oder alles zu finden, das nicht ein Separator ist:

>>> re.findall(r'[^,]+', '1,2,,3,') 
['1', '2', '3'] 

Wenn Sie Weg zurück in Python Geschichte gehen wollen, gab es zwei separate Funktionen, split und splitfields. Ich denke, der Name erklärt den Zweck. Der erste Teil teilt sich in beliebige Leerzeichen auf, die für die Eingabe willkürlicher Zeichen nützlich sind, und das zweite verhält sich vorhersagbar bei einigen Eingrenzungen. Sie wurden vor Version 1.6 in reinem Python implementiert.

0

Nun, ich denke, Sie brauchen vielleicht nur eine Hand, um die Dokumentation zu verstehen. In Ihrem Beispiel zeigen Sie ziemlich genau die Unterschiede in dem in der Dokumentation erwähnten Algorithmus.Das Schlüsselwort argument zu verwenden, ist mehr oder weniger wie sep=' ' zu verwenden und dann die leeren Zeichenfolgen auszuwerfen. Wenn Sie mehrere Leerzeichen hintereinander haben, teilt der Algorithmus diese auf und findet None. Da Sie explizit wollten, dass alles durch ein Leerzeichen geteilt werden soll, wird None in eine leere Zeichenfolge konvertiert. Das Ändern von None in eine leere Zeichenfolge ist in diesem Fall eine gute Vorgehensweise, da die Signatur der Funktion (oder anders ausgedrückt, die Funktion) nicht geändert wird. In diesem Fall wird eine Liste mit Zeichenfolgen zurückgegeben.

unten zeigt, wie eine leere Zeichenkette mit 4 Leerzeichen anders ...

behandelt wird
>>> empty = ' ' 
>>> s = 'this is an irritating string with random spacing .' 
>>> empty.split() 
[] 
>>> empty.split(' ') 
['', '', '', ''] 

für Sie in Frage, benutzen Sie einfach split() ohne sep Argument

-1

Zeichenfolge s gut = ‚Diese ist eine irritierende Zeichenfolge mit zufälligem Abstand. ', die mehr als einen Leerraum enthält, deshalb empty.split (' ') gibt Noney-Wert zurück.

Sie müssten zusätzlichen Leerraum aus Zeichenfolge s entfernen und kann das gewünschte Ergebnis erhalten.

Verwandte Themen