Wie kann man in Python durch Komma trennen und Leerzeichen entfernen?

Lesezeit: 6 Minuten

Benutzeravatar von Mr_Chimp
Mr_Chimp

Ich habe einen Python-Code, der das Komma teilt, aber das Leerzeichen nicht entfernt:

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

Ich würde lieber mit Leerzeichen wie folgt enden:

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

Mir ist bewusst, dass ich die Liste durchlaufen und jedes Element strip() ausführen könnte, aber da dies Python ist, vermute ich, dass es eine schnellere, einfachere und elegantere Möglichkeit gibt, dies zu tun.

Benutzeravatar von Sean Vieira
Sean Vieira

Verwenden Sie das Listenverständnis – einfacher und genauso leicht zu lesen wie a 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"]

Sehen: Python-Dokumentation zum Listenverständnis

Eine gute 2-Sekunden-Erklärung zum Listenverständnis.

  • Super gut! Ich habe ein Element wie folgt hinzugefügt, um die leeren Listeneinträge loszuwerden. > Text = [x.strip() for x in text.split(‘.’) if x != ”]

    – RandallShanePhD

    28. Juli 2017 um 19:41 Uhr


  • @Sean: War ungültiger/unvollständiger Python-Code Ihre “ursprüngliche Absicht des Beitrags”? Laut den Review-Wichsern war es: stackoverflow.com/review/suggested-edits/21504253. Können Sie ihnen bitte etwas anderes sagen, indem Sie die Korrektur vornehmen, wenn sie (wieder) falsch liegen?

    – Futter

    25. November 2018 um 10:19 Uhr

  • Das Original wurde aus einer REPL kopiert (wenn ich mich richtig erinnere) und das Ziel war das Verständnis des zugrunde liegenden Konzepts (Verwenden des Listenverständnisses zum Ausführen einer Operation) – aber Sie haben Recht, es ist sinnvoller, wenn Sie es tun sehen dieses Listenverständnis erzeugt eine neue Liste.

    – Sean Vieira

    26. November 2018 um 0:24 Uhr

Benutzeravatar von Sean
Sean

Ich kam, um hinzuzufügen:

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

aber gesehen, es wurde bereits von Jason Orendorff in einem Kommentar erwähnt.

Als ich Glenn Maynards Kommentar zu derselben Antwort las, der Listenverständnisse über der Karte vorschlug, begann ich mich zu fragen, warum. Ich nahm an, er meinte Performance-Gründe, aber er könnte natürlich stilistische Gründe oder etwas anderes (Glenn?) gemeint haben.

Ein schneller (möglicherweise fehlerhafter?) Test auf meiner Box (Python 2.6.5 auf Ubuntu 10.04), bei dem die drei Methoden in einer Schleife angewendet wurden, ergab:

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

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

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

Herstellung map(str.strip, string.split(',')) der Gewinner, obwohl es scheint, dass sie alle im selben Stadion sind.

Allerdings sollte Map (mit oder ohne Lambda) aus Performance-Gründen nicht unbedingt ausgeschlossen werden und ist für mich mindestens so klar wie ein Listenverständnis.

  • bessere Antwort list(map(str.strip, string.split(',')))

    – gndps

    30. Juni 2022 um 16:55 Uhr

  • Am saubersten und am schnellsten

    – Mark Seagoe

    5. August 2022 um 1:53 Uhr

Benutzeravatar von tbc0
tbc0

Unter Verwendung eines regulären Ausdrucks aufteilen. Beachten Sie, dass ich den Fall mit führenden Leerzeichen allgemeiner gemacht habe. 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']

Das funktioniert auch wenn ^\s+ passt nicht:

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

Deshalb brauchen Sie ^\s+:

>>> 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 Leerzeichen in blah?

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

  • Ich glaube [x.strip() for x in my_string.split(',')] ist für die gestellte Frage pythonischer. Vielleicht gibt es Fälle, in denen meine Lösung notwendig ist. Ich werde diesen Inhalt aktualisieren, wenn ich auf einen stoße.

    – tbc0

    27. Juli 2014 um 23:32 Uhr

  • Warum ist ^\s+ notwendig? Ich habe Ihren Code ohne ihn getestet und er funktioniert nicht, aber ich weiß nicht warum.

    – See9m

    21. April 2015 um 9:33 Uhr

  • Wenn ich benutze re.compile("^\s*,\s*$")Ergebnis ist [' blah, lots , of , spaces, here '].

    – See9m

    21. April 2015 um 15:40 Uhr

  • @ laike9m, ich habe meine Antwort aktualisiert, um Ihnen den Unterschied zu zeigen. ^\s+ macht. Wie Sie selbst sehen können, ^\s*,\s*$ liefert auch nicht die gewünschten Ergebnisse. Wenn Sie also mit einem regulären Ausdruck aufteilen möchten, verwenden Sie ^\s+|\s*,\s*|\s+$.

    – tbc0

    21. April 2015 um 17:05 Uhr


  • Die erste Übereinstimmung ist leer, wenn das führende Muster (^\s+) nicht übereinstimmt, also erhalten Sie so etwas wie [ ”, ‘foo’, ‘bar’ ] für die Zeichenfolge “foo, bar”.

    – Steve McCauley

    1. April 2016 um 12:36 Uhr

Entfernen Sie einfach die Leerzeichen aus der Zeichenfolge, bevor Sie sie teilen.

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

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

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

Der \s entspricht jedem Leerzeichen, und wir ersetzen es einfach durch eine leere Zeichenfolge ''. Weitere Informationen finden Sie hier: http://docs.python.org/library/re.html#re.sub

  • Ihr Beispiel würde bei Zeichenfolgen mit Leerzeichen nicht funktionieren. “for, example this, one” würde zu “for”, “examplethis”, “one”. Ich sage nicht, dass es eine SCHLECHTE Lösung ist (es funktioniert perfekt in meinem Beispiel), es hängt nur von der jeweiligen Aufgabe ab!

    – Mr_Chimp

    1. Februar 2012 um 16:11 Uhr

  • Ja, das ist sehr richtig! Sie könnten wahrscheinlich den Regexp so anpassen, dass er Zeichenfolgen mit Leerzeichen verarbeiten kann, aber wenn das Listenverständnis funktioniert, würde ich sagen, bleiben Sie dabei;)

    – Brad Montgomery

    3. Februar 2012 um 4:36 Uhr

Benutzeravatar von user470379
Benutzer470379

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

  • Ihr Beispiel würde bei Zeichenfolgen mit Leerzeichen nicht funktionieren. “for, example this, one” würde zu “for”, “examplethis”, “one”. Ich sage nicht, dass es eine SCHLECHTE Lösung ist (es funktioniert perfekt in meinem Beispiel), es hängt nur von der jeweiligen Aufgabe ab!

    – Mr_Chimp

    1. Februar 2012 um 16:11 Uhr

  • Ja, das ist sehr richtig! Sie könnten wahrscheinlich den Regexp so anpassen, dass er Zeichenfolgen mit Leerzeichen verarbeiten kann, aber wenn das Listenverständnis funktioniert, würde ich sagen, bleiben Sie dabei;)

    – Brad Montgomery

    3. Februar 2012 um 4:36 Uhr

Benutzeravatar von Zieng
Zieng

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

das funktioniert gut für mich.

1448890cookie-checkWie kann man in Python durch Komma trennen und Leerzeichen entfernen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy