listen replace

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.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Es gibt auch die Möglichkeit das ganze mit der replace-Methode für strings zu lösen.

Hier ist mein Ansatz:

Code: Alles auswählen

>>> def replace(liste, old, new):
	return (str(liste).replace(str(old), str(new))).split('[')[1].split(']')[0].split(', ')

>>> replace(range(10), 4, 0)
['0', '1', '2', '3', '0', '5', '6', '7', '8', '9']
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Pascal hat geschrieben:Es gibt auch die Möglichkeit das ganze mit der replace-Methode für strings zu lösen.
Nichts fuer ungut, Dein Beispiel ist aber am Ende nicht mehr als Spielerei. Dein Code ist uneffizient und unflexibel. Wuerde niemand so machen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@Pascal: dafür müsstest du aber "funktioniert" ganz neu definieren.

Code: Alles auswählen

replace(["[", "1,2", "]", 4, 5], 4, 42)

Code: Alles auswählen

replace([{1:2, 3:4, 5:6}], 4, 42)
Das Leben ist wie ein Tennisball.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

hendrikS hat geschrieben:
Pascal hat geschrieben:Es gibt auch die Möglichkeit das ganze mit der replace-Methode für strings zu lösen.
Nichts fuer ungut, Dein Beispiel ist aber am Ende nicht mehr als Spielerei. Dein Code ist uneffizient und unflexibel. Wuerde niemand so machen.
Ich wollt ja lediglich einen anderen Lösungsvorschlag präsentieren.
Und das es auch bei komplexeren Listen nicht ganz funktinoniert hat ja EyDu schon gezeigt ;)
BlackJack

@Pascal: Das ist vielleicht ein Vorschlag gewesen, aber keine Lösung. Wenn man eine Sprache haben möchte, bei Datenstrukturen über Zeichenketten simuliert werden, sollte man Shell- oder Tcl-Skripte schreiben, aber bitte nicht Python. :roll:
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Kann es sein, das du vielleicht lieber ein set() anstatt eine Liste möchtest? Wenn die Ordnung der Liste nicht wichtig ist und du sie benutzt, um gleichartige Elemente festzuhalten, ist eine Menge oft angebrachter. Mengen besitzen eine discard() Funktion, die ein Element entfernt, wenn es schon vorhanden ist und ansonsten nichts tut. add() fügt ein Element nur dann hinzu wenn es nicht bereits vorhanden ist. Willst du also ein Element durch ein anderes ersetzen, welches sich mit einem anderen identifiziert, kannst du discard() und add() hintereinander aufrufen und deckst alle Fälle ab (angenommen, du willst Objekte auch hinzufügen, wenn sie noch nicht vorhanden sind). Mit Mengen und entsprechenden Objekten, die __hash__ und __eq__ / __neq__ implementieren kann man so recht nette Sachen machen.

Code: Alles auswählen

>>> my_set = set()
>>> class A(object):
...  def __init__(self, name):
...     self.name = name
...  def __str__(self):
...      return "Name: %s" % self.name
...  __repr__ = __str__ # Don't do this at home
...  def __hash__(self):
...     return 1
...  def __eq__(self, other):
...      return True
...  def __neq__(self, other):
...      return not self == other
... 
>>> my_set.add(A("First"))
>>> print my_set
set([Name: First])
>>> my_set.add(A("Second"))
>>> print my_set
set([Name: First])
>>> my_set.pop()
Name: First
>>> my_set
set([])
>>> my_set.add(A("Second"))
>>> my_set
set([Name: Second])
>>> my_set.discard(A("Third"))
>>> my_set
set([])
>>> my_set.add(A("Fourth"))
>>> my_set
set([Name: Fourth])
@cofi: Man kann Methoden zu jeder Klasse hinzufügen, die keine Builtin Klasse ist. list.replace = replace funktioniert also nicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:@cofi: Man kann Methoden zu jeder Klasse hinzufügen, die keine Builtin Klasse ist. list.replace = replace funktioniert also nicht.
Wenn ich mich richtig erinnere hat Trundle ein Stückchen Code geschrieben, dass auch das mittels ctypes hinbekommt. Ist natürlich ein fieser Hack, aber trotzdem irgendwie cool.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ja, aber daß funktionierte doch nur, weil id() momentan die Speicheraddresse eines Objektes zurückliefert und man diese als Pointer benutzen kann? Insofern wäre es also nur möglich, bereits vorhandene Namen zu überschreiben, aber keine neuen anzulegen. Aber man kann damit schon nette Sachen machen :)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Nein, man holt sich einfach das Dict mit `ctypes.pythonapi._PyObject_GetDictPtr()` und verändert das. Dazu braucht man keine Adresse, sondern nur ein Py-Objekt und man kann auch Sachen hinzufügen.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Antworten