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.
Also, ich möchte den String in v verändern, das funktioniert wenn ich ihn direkt ausgebe aber nicht wenn ich den String v übergeben will. v ist kein String das ist klar, aber in was muss ich den String verpacken/ umwandeln damit er reinpasst?
def changevalinlist(d):
for k, v in d.iteritems():
if isinstance(v, dict):
changevalinlist(v)
else:
# funktioniert
print([w.replace('hallo', 'tschüs') for w in v])
# das nicht
v = [w.replace('hallo', 'tschüs') for w in v]
Hat jemand eine Idee?
Man findet überall nur Beispiel wo der Schlüssel(k) geändert wird weil das andere wohl trivial ist, ich aber nicht drauf komme. :-/
callsaender hat geschrieben:Man findet überall nur Beispiel wo der Schlüssel(k) geändert wird weil das andere wohl trivial ist, ich aber nicht drauf komme. :-/
Das glaube ich nicht, denn das ist bei einem Dictionary gar nicht möglich.
"changevalinlist" ist übrigens ein sehr seltsamer Name. Unnötige Abkürzung, hält sich nicht an PEP 8, sagt gar nichts über die Funktion aus und bekommt dann noch ein Dictionary übergeben in dem eine Liste geändert wird.
@callsaender: Ergänzend zu EyDu's Anmerkungen musst Du wenn Du das Wörterbuch veränderst über eine Liste mit den Schlüssel/Wert-Paaren iterieren, also `items()` statt `iteritems()`. Wenn man über Container-Objekte verändert, während man gleichzeitig über den Inhalt iteriert, ist nicht garantiert, dass man den kompletten Inhalt in der Schleife sieht.
Um die ``print``-Anweisung gehören in Python 2 keine Klammern. Es sei denn man hat den entsprechenden `__future__`-Import der aus der Anweisung eine Funktion macht oben im Modul stehen.
Bist Du immer noch dabei JSON-P-Dateien mit ungeeigneten Mitteln zu bearbeiten?
@callsaender: Wenn `v` gar keine Liste von Zeichenketten ist sondern selbst eine Zeichenkette, dann lass die „list comprehension” doch einfach weg. Eine Zeichenkette ist halt auch iterierbar → die Elemente sind die einzelnen Zeichen.
Wenn Du zwischen Zeichenkette und Liste unterscheiden musst, dann musst Du genau das an der Stelle halt machen: Zeichenketten anders als Listen behandeln. Also nur bei Zeichenketten die Ersetzung durchführen und bei Listen eine neue Liste erstellen auf deren Elemente die Funktion wieder rekursiv angewendet wird.
Mit so kleinen Schnipseln können wird dir kaum helfen. Erstelle mal ein minimales *lauffähiges* Beispiel welches deinen Fehler produziert und poste das hier. Beim Kürzen deines Programms findest du wahscheinlich den Fehler schon selbst.
@callsaender: Das kann nicht sein. Wenn Du einen neuen Wert einem Schlüssel zuweist und der gleich danach nicht wieder auslesbar wäre, dann hätten Wörterbücher ein extrem heftiges Problem. Ich bin mir sicher das wäre schon mal jemandem vor Dir aufgefallen.
d = {"a": "schlecht"}
d["a"]
'schlecht'
'schlecht'.replace('schlecht', 'gut')
'gut'
d['a'].replace('schlecht', 'gut')
'gut'
d
{'a': 'schlecht'}
Du holst Dir den zu einem Schlüssel gehörigen Wert *aus* dem Dictionary und führst ``replace`` auf diesem aus. Du ersetzt aber eben *nicht* den Wert *im* Dictionary
@BlackJack: wie würdest du das machen wenn nicht mit iteritems() oder iter() was man nicht einfach
hier ersetzen kann oder .findall() was ich in dieser "Datenstruktur" noch nicht hin bekommen habe ??
Und zum drölftausendsten mal: Nicht über eine Datenstruktur iterieren *und* sie verändern. Undefiniertes Verhalten. Böse.
@BlackJack:
Ich hatte items() schon mal aus probiert und bekam eine Fehlermeldung die aber wo anders her kam, wie sich jetzt rausgestellt hat. Und ich verwende jetzt selbstverständlich 'item' wenn es dich beruhigt
@all
Es gibt das Kommentierungzeichen '#' in Python. In C kann man mehrere Zeilen gleichzeitig Kommentieren mit /* */ gibt es in Python ewas ähnliches ?
Hintergrung: Ich habe für den Rest des Projekts (nicht in Python geschrieben) sowas wie JavaDoc das die Kommentare raus filtert und in eine html Doku fasst.
@callsaender: Nein in Python gibt es nur # für Kommentare. Jeder brauchbare Editor kann damit aber auch Blöcke aus/einkommentieren. Für generierte Dokumentation wird in Python üblicherweise DocStrings verwendet. Die meisten Systeme erkennen auch noch spezielle Kommentare. Sphinx zum Beispiel wenn der Kommentar mit #: anfängt. Sphinx ist das Dokumentationswerkzeug mit dem unter anderem die Python-Dokumentation erstellt wird.