Seite 1 von 1
Trennen von Strings
Verfasst: Mittwoch 24. März 2010, 12:50
von api
Hallo zusammen,
ich habe eine Liste mit Strings, die in 2 Hälften geteilt werden soll. Ich würde gerne wissen, wie man sowas am geschicktesten anstellt?
Hier meine Liste:
Als Ergebnis benötige ich nun:
Code: Alles auswählen
[['Flughafen', '120'], ['Bauten', '129p3'], ['Brem', '23p12']]
Also von der Syntax her, müsste der String beim 1. Auftreten einer Ziffer getrennt werden.
Hat jemand einen Vorschlag?
CU,
API
Verfasst: Mittwoch 24. März 2010, 13:06
von gkuhl
Hallo api,
du kannst string.isdigit() benutzen um die Position der ersten Zahl zu bestimmen. Der Rest geht dann mit Slicing und einer LCs.
Grüße
Gerrit
Verfasst: Mittwoch 24. März 2010, 13:07
von Pekh
Welche Varianten hast du denn schon versucht? Und was ist bei denen das Problem? Ich würde es ja mal mit index() und Slicing probieren.
Nachtrag: index() ist in dem Fall natürlich Unfug. isdigit oder ein Vergleich mit einer Sequenz von Ziffern (gibts auch vordefniert) wäre der richtige Ansatz.
Verfasst: Mittwoch 24. März 2010, 13:13
von api
Meint ihr, dass ich den String zeichenweise durchgehe und dann abfrage, ob es sich um eine Ziffer handelt? Wenn ja, wird der String getrennt mittels Slicing?
By the way, was bedeutet "LCs"?
Verfasst: Mittwoch 24. März 2010, 13:17
von mkesper
api hat geschrieben:Meint ihr, dass ich den String zeichenweise durchgehe und dann abfrage, ob es sich um eine Ziffer handelt? Wenn ja, wird der String getrennt mittels Slicing?
Genau.
api hat geschrieben:By the way, was bedeutet "LCs"?
Steht im sehr empfehlenswerten
Tutorial.

Verfasst: Mittwoch 24. März 2010, 13:23
von api
Ah ja, danke!!
Auf List Comprehensives bin ich nicht gekommen.. Stimmt aber, dürften in diesem Zusammenhang ganz hilfreich sein...

Verfasst: Mittwoch 24. März 2010, 13:52
von Dav1d
Mit ner regex...
Code: Alles auswählen
>>> r = re.compile('(\D*)(\w*)')
>>> l = ['Flughafen120', 'Bauten129p3', 'Brem23p12']
>>> [r.match(i).group(1,2) for i in l]
[('Flughafen', '120'), ('Bauten', '129p3'), ('Brem', '23p12')]
//Edit: r.findall => r.match
Verfasst: Mittwoch 24. März 2010, 17:35
von api
Hi Dav1d,
das ist ja ne trickreiche Lösung. Danke Dir !!!
CU,
API
Verfasst: Mittwoch 24. März 2010, 17:41
von Pekh
Die armen Spatzen ...

Verfasst: Mittwoch 24. März 2010, 17:54
von api
Hi Pekh,
kannst du mir verraten, was du mit Spatzen meinst? Stehe da irgendwie auf der Leitung...

Verfasst: Mittwoch 24. März 2010, 17:57
von Dav1d
Mit Kanonen auf Spatzen schießen, meint er
Verfasst: Mittwoch 24. März 2010, 18:05
von api
Ach so...
Sicherlich sieht das etwas oversized aus, aber ich kann das trotzdem gut gebrauchen... Ist auch immer wieder gut, ne neue Perspektive zu bekommen.
CU,
API
Verfasst: Mittwoch 24. März 2010, 19:38
von snafu
Ich würde solche Fälle allerdings auch mit regulären Kanonen lösen. Sieht für mich irgendwie eleganter aus.
EDIT: Wobei ... zumindest der Ausdruck an sich. Das Exrahieren der Ausgabe (`group()` und so) ist natürlich nicht mehr so schön.
Verfasst: Mittwoch 24. März 2010, 19:49
von Dav1d
Ich finde ich hab's elegeant gelöst mit group(1,2), hast du was Besseres?
Verfasst: Donnerstag 25. März 2010, 03:10
von jerch
@Dav1d:
Warum bist Du nicht bei findall() geblieben? Geht doch schön übersichtlich damit:
Code: Alles auswählen
>>> import re
>>> rex = re.compile('\D+|.+')
>>> map(rex.findall, ['Flughafen120', 'Bauten129p3', 'Brem23p12'])
[['Flughafen', '120'], ['Bauten', '129p3'], ['Brem', '23p12']]
Falls die Listenrückgabe stört, kann man ja auf Generatoren mittels imap und finditer() ausweichen.
Verfasst: Donnerstag 25. März 2010, 15:03
von Dav1d
@jerch, ich weiß es nicht mehr, aber einen Grund hatte ich...