Gewisse Zeichen in String ignorieren

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Hallo zusammen,

ich frage mich, ob es eine Funktion gibt, welche gewisse characters in einem String ignoriert.

Mein momentanes Problem:
Ich habe Strings wie "Flut+licht" und möchte sie nachher in einer Funktion behandeln. Dafür sollte aber das "+" ignoriert werden, also etwas wie:
if text.ignore("+") in names: [...]

Ich sage bewusst "ignorieren" und nicht ersetzen (replace) - weil dann weiss ich am Schluss nicht mehr, wo und bei welchen Wörtern dieses "+" vorkam. (Es haben nur vereinzelte Wörter ein "+" - und dieses möchte ich am Schluss wieder haben...)

Danke für Ideen, Tipps und Hilfe :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du könntest z.B. ein Dictionary bauen, welches den Originalstring auf einen "bereinigten" abbildt. Bei kritischen Operationen (wie z.B. einem Vergleich o.ä.) holst Du Dir das dem Dictionary die bereinigte Form.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Ok, an das habe ich auch gedacht.
Eine "einfachere" Lösung gibt es also wirklich nicht?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MarcelF6 hat geschrieben:Eine "einfachere" Lösung gibt es also wirklich nicht?
Gegenfrage: Was ist daran nicht einfach?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Wenn ich mal alle performancekritischen Aspekte außen vor lasse dann erzeuge aus den Quellstrings tupel: ('Flut', 'licht').

Den Quellstring kann man daraus herleiten und das ganze lässt sich auch als ein String betrachten. str.join ist Dein Freund hier. So hast Du auch keine Redundanzen bei Deinem Datenbestand.

Wesentlich einfacher wirst Du es nicht mehr hinbekommen. Es sei denn es erfindet jemand eine MagicWand Klasse.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Hallo zusammen,

vielen Dank für eure Antworten! :)
Ich habe mich entschieden, mit Listen zu arbeiten, denn die eigenen sich besser für die weitere Verarbeitung.
Ich habe noch eine Frage:
Das Ursprungs"format" sieht so aus:
target = [([('Kid', '200-5'), (u'Rock', '200-6')], u's725')]
Tupel kann man ja nicht bearbeiten. Nun meine Frage: Wie kann ich die Tupel bearbeiten, sodass ich am Schluss wieder das Ursprungsformat erhalte?
Ich probiere seit mehreren Stunden, target in eine Liste umzuwandeln (geklappt), dann dort zu bearbeiten (geklappt), und dann wieder ins Ursprungs"format" zurückzuverwandeln. Hier klappt etwas nicht...könnte mir jemand zeigen, wie das geht - bzw. einen Tipp geben?
Ich wäre sehr dankbar. :)

Merci, Marcel.
BlackJack

@MarcelF6: Du sagst man kann Tupel nicht bearbeiten und fragst im nächsten Satz wie man Tupel bearbeiten kann. :-D Na gar nicht. Du kannst neue erstellen.

Und wie man aus der Datenstruktur die wir nicht kennen wieder die machen kann die Du gezeigt hast, kann natürlich keiner beantworten. Jedenfalls nicht ohne Glaskugel.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

haha ja, du verstehst was ich meinte ;)

Nein aber ernsthaft: Ich habe mir vorgestellt, die Daten aus target in eine temporäre Liste zu speichern, dort zu bearbeiten, und nachher eine neue Liste mit den bearbeiteten Daten (und demselben Format wie target) wieder auszugeben.

Ist das wirklich nicht möglich? :S
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MarcelF6 hat geschrieben: Ich habe mir vorgestellt, die Daten aus target in eine temporäre Liste zu speichern, dort zu bearbeiten, und nachher eine neue Liste mit den bearbeiteten Daten (und demselben Format wie target) wieder auszugeben.
*WIE* sollen denn die Daten in der Liste aussehen???
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Siehe Beispiel: In einer Liste sin Tupel gespeichert, die aus einer Liste (bestehend aus mind. 1 Tupel), und einer ID bestehen.
Beispiel = [([('Name', '200-5'), (u'Irgendwas', '200-6')], u's725'), ([('Nochwas', '250-5'), (u'undsoweiter', '250-6')], u's985')]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MarcelF6 hat geschrieben:Siehe Beispiel: ...
*seufz* Noch einmal: Wie sollen die Daten in Deiner bisher imaginären "temporären Liste" aussehen? Dazu hast Du uns immer noch kein Beispiel gegeben...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Wenn du eine Liste einer Funktion übergibst, ändert sich die Liste dadurch nicht. Auch ändert sich die Liste nicht, wenn du die Werte mittels eines "replace" oder "split" wiedergibst.
Ich glaube dein Problem ist durch fehlendes Verständnis entstanden.

Code: Alles auswählen

stringlist = ["flucht+licht", "leucht+turm", "kaffeebecher"]

for string in stringlist:
    print("".join(string.split('+')))

print(stringlist)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

MarcelF6 hat geschrieben:...
Tupel kann man ja nicht bearbeiten. Nun meine Frage: Wie kann ich die Tupel bearbeiten, sodass ich am Schluss wieder das Ursprungsformat erhalte?
Ich probiere seit mehreren Stunden, target in eine Liste umzuwandeln (geklappt), dann dort zu bearbeiten (geklappt), und dann wieder ins Ursprungs"format" zurückzuverwandeln. Hier klappt etwas nicht...
...
Und was genau passt Dir an einer "enttupelten" analogen Datenstruktur nicht? Wenn Du die Tupel durch Listen ersetzt, hast du die gleichen Möglichkeiten plus der Veränderbarkeit:

Code: Alles auswählen

from collections import deque

def detuple_strange_container_thingy(it):
    stack = deque()
    stack.appendleft((1, it))
    transformed = []
    entries = [transformed]
    depth_old = 1
    while stack:
        depth, it = stack.popleft()
        it_iter = iter(it)
        if depth_old > depth:
            entries = entries[:depth]
        elif len(entries) < depth:
            new = []
            entries.append(new)
            entries[depth-2].append(new)
        target = entries[depth-1]
        for el in it_iter:
            if not hasattr(el, '__iter__'):
                target.append(el)
            else:
                stack.appendleft((depth, it_iter))
                stack.appendleft((depth+1, el))
                break
        depth_old = depth
    return transformed
Wenn ich Dich wörtlich nehme und Du unbedingt die alte Struktur restaurieren willst, musst Du halt in einer zusätzlichen Datenstruktur die Tupelpositionen mitschleppen und nach der Bearbeitung der Einträge den Datencontainer analog zum "Enttupeln" wieder "Vertupeln".
Antworten