webentwicklung-frage-antwort-db.com.de

Durch Komma teilen und Whitespace in Python entfernen

Ich habe python Code, der durch Komma getrennt wird, aber das Leerzeichen nicht entfernt:

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

Ich würde es vorziehen, wenn Leerzeichen wie folgt entfernt würden:

['blah', 'lots', 'of', 'spaces', 'here']

Ich bin mir bewusst, dass ich die Liste durchlaufen und jedes Element entfernen könnte, aber da dies Python ist, gibt es vermutlich eine schnellere, einfachere und elegantere Möglichkeit, dies zu tun.

297
Mr_Chimp

Verwenden Sie das Listenverständnis - einfacher und genauso einfach zu lesen wie eine for -Schleife.

my_string = "blah, lots  ,  of ,  spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]

Siehe: Python-Dokumente zum Listenverständnis
Eine gute Erklärung des Listenverständnisses für 2 Sekunden.

511
Sean Vieira

Teilen mit einem regulären Ausdruck. Hinweis: Ich habe den Fall mit führenden Leerzeichen allgemeiner formuliert. Das Listenverständnis besteht darin, die Nullzeichenfolgen vorne und hinten zu entfernen.

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

Dies funktioniert auch, wenn ^\s+ nicht übereinstimmt:

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

Hier ist, warum du ^\s + brauchst:

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

Sehen Sie die führenden Räume in bla?

Klarstellung: oben wird der Interpreter Python 3 verwendet, aber die Ergebnisse sind in Python 2 gleich.

21
tbc0

Ich bin gekommen, um hinzuzufügen:

map(str.strip, string.split(','))

aber sah, dass es bereits von Jason Orendorff in erwähnt worden war ein Kommentar .

Als ich Glenn Maynards Kommentar in derselben Antwort las, der Listenverständnisse über die Karte vorschlug, begann ich mich zu fragen, warum. Ich nahm an, er meinte es aus Performancegründen, aber natürlich hätte er es aus stilistischen Gründen gemeint, oder aus etwas anderem (Glenn?).

So ergab ein schneller (möglicherweise fehlerhafter?) Test meiner Box, bei dem die drei Methoden in einer Schleife angewendet wurden:

[Word.strip() for Word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

map(str.strip, string.split(',')) zum Gewinner machen, obwohl es den Anschein hat, als wären sie alle im gleichen Stadion.

Natürlich sollte eine Karte (mit oder ohne Lambda) aus Leistungsgründen nicht unbedingt ausgeschlossen werden, und für mich ist sie mindestens so klar wie ein Listenverständnis.

Bearbeiten:

Python 2.6.5 unter Ubuntu 10.04

14
Sean

Entfernen Sie einfach den Leerraum aus der Zeichenfolge, bevor Sie sie teilen.

mylist = my_string.replace(' ','').split(',')
12
user489041

Ich weiß, dass dies bereits beantwortet wurde, aber wenn Sie dies häufig tun, sind reguläre Ausdrücke möglicherweise der bessere Weg:

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

Der \s entspricht einem beliebigen Leerzeichen, und wir ersetzen es einfach durch einen leeren String ''. Weitere Informationen finden Sie hier: http://docs.python.org/library/re.html#re.sub

11
Brad Montgomery
import re
result=[x for x in re.split(',| ',your_string) if x!='']

das funktioniert gut für mich.

2
Zieng

re (wie in regulären Ausdrücken) ermöglicht das Aufteilen auf mehrere Zeichen gleichzeitig:

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

Dies funktioniert nicht gut für Ihre Beispielzeichenfolge, aber gut für eine durch Kommas getrennte Liste. Für Ihre Beispielzeichenfolge können Sie die re.split-Potenz kombinieren, um auf Regex-Muster aufzuteilen, um einen "Split-on-this-or-that" -Effekt zu erzielen.

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

Leider ist das hässlich, aber ein filter wird den Trick machen:

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

Voila!

2
Dannid
s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st
2
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)

Einfach Komma oder mindestens ein Leerzeichen mit/ohne vorangestellten/nachfolgenden Leerzeichen.

Bitte versuche!

1
GyuHyeon Choi

map(lambda s: s.strip(), mylist) wäre ein bisschen besser als eine explizite Schleife. Oder für das Ganze auf einmal: map(lambda s:s.strip(), string.split(','))

1
user470379

map(lambda s: s.strip(), mylist) wäre ein bisschen besser als eine explizite Schleife.
Oder für das Ganze auf einmal:

map(lambda s:s.strip(), string.split(','))

Das ist im Grunde alles was Sie brauchen.

0
DJbigpenis