Substring mit Pattern

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
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Folgendes einfache Problem: ich habe einen String, z.B.: "ABCDEFGHIJKLMNOP". Aus diesem String brauche ich bestimmte Teile, die durch einen Positionsstring beschrieben sind, z.B.: "4568", ich möchte demnach die 4., 5., 6. und 8. Position in einem neuen String haben, z.B.: "DEFH".

Jetzt mache ich das so, also ziemlich unelegant:

Code: Alles auswählen

string = "ABCDEFGHIJKLMNOP"
pattern = "4568"
result = ''.join([string[int(p)-1] for p in pattern])
print result
Gibt es ein Slicing oder sonst eine Funktion mit der das eleganter geht?
deets

Nein - und ich finde eine Zeile schon recht gut ;)

Ist dir das Pattern so vorgegeben? Ich halte es fuer unzulaenglich - was passiert, wenn du Strings mit Laenge > 10 hast?

Ich wuerde es daher als simples Tupel von Zahlen machen. Wenn du ein bisschen optimieren magst, dann kannst du konsekutive Sequenzen als slices darstellen.

Code: Alles auswählen


s = "ABCDEFGHIJKLMNOPQRSTUVW"

patterns = [
    (3, 4, 5),
    (1, slice(4,7), 10),
    ]

for p in patterns:
    print "".join(s[part] for part in p)

rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Der String ist bezüglich Länge (< 10) und erlaubtem Inhalt fest vorgegeben.
Das Pattern muss DAU-lesbar sein. Somit ist "789" das höchste der Gefühle. Das zugehörige "slice(6,8)" ist zu kompliziert für den Endanwender; ausserdem ist darin der -1 Versatz enthalten weil der String-Index bei 0 anstatt bei 1 anfängt. Daher müsste ich "789" zuerst in slice(6,8) übersetzen was dann wieder viel mehr Code ergibt.

Trotzdem vielen Dank für den Vorschlag; die Methode slice() war mir nämlich neu.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kleine Anmerkung noch:
Du solltest den Namen "string" vermeiden, da Du damit ein Modul der Standardlib überschreibst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten