Trennen von Strings

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

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:

Code: Alles auswählen

['Flughafen120', 'Bauten129p3', 'Brem23p12']
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
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

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"?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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. :)
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Ah ja, danke!!

Auf List Comprehensives bin ich nicht gekommen.. Stimmt aber, dürften in diesem Zusammenhang ganz hilfreich sein... :?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hi Dav1d,

das ist ja ne trickreiche Lösung. Danke Dir !!! :D

CU,
API
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Die armen Spatzen ... :lol:
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hi Pekh,

kannst du mir verraten, was du mit Spatzen meinst? Stehe da irgendwie auf der Leitung... :lol:
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Mit Kanonen auf Spatzen schießen, meint er
the more they change the more they stay the same
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Ach so... :idea:

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
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich finde ich hab's elegeant gelöst mit group(1,2), hast du was Besseres?
the more they change the more they stay the same
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@jerch, ich weiß es nicht mehr, aber einen Grund hatte ich...
the more they change the more they stay the same
Antworten