Seite 1 von 1

Gewisse Zeichen in String ignorieren

Verfasst: Montag 3. Februar 2014, 15:13
von MarcelF6
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 :)

Re: Gewisse Zeichen in String ignorieren

Verfasst: Montag 3. Februar 2014, 15:18
von Hyperion
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.

Re: Gewisse Zeichen in String ignorieren

Verfasst: Montag 3. Februar 2014, 15:37
von MarcelF6
Ok, an das habe ich auch gedacht.
Eine "einfachere" Lösung gibt es also wirklich nicht?

Re: Gewisse Zeichen in String ignorieren

Verfasst: Montag 3. Februar 2014, 16:20
von Hyperion
MarcelF6 hat geschrieben:Eine "einfachere" Lösung gibt es also wirklich nicht?
Gegenfrage: Was ist daran nicht einfach?

Re: Gewisse Zeichen in String ignorieren

Verfasst: Montag 3. Februar 2014, 16:28
von bwbg
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.

Re: Gewisse Zeichen in String ignorieren

Verfasst: Dienstag 4. Februar 2014, 15:47
von MarcelF6
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.

Re: Gewisse Zeichen in String ignorieren

Verfasst: Dienstag 4. Februar 2014, 15:58
von 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.

Re: Gewisse Zeichen in String ignorieren

Verfasst: Dienstag 4. Februar 2014, 17:02
von MarcelF6
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

Re: Gewisse Zeichen in String ignorieren

Verfasst: Dienstag 4. Februar 2014, 17:08
von Hyperion
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???

Re: Gewisse Zeichen in String ignorieren

Verfasst: Dienstag 4. Februar 2014, 17:25
von MarcelF6
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')]

Re: Gewisse Zeichen in String ignorieren

Verfasst: Dienstag 4. Februar 2014, 17:32
von Hyperion
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...

Re: Gewisse Zeichen in String ignorieren

Verfasst: Dienstag 4. Februar 2014, 17:40
von Dami123
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)

Re: Gewisse Zeichen in String ignorieren

Verfasst: Mittwoch 5. Februar 2014, 00:02
von jerch
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".