Seite 1 von 2
Verfasst: Samstag 15. August 2009, 22:41
von Pascal
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']
Verfasst: Sonntag 16. August 2009, 07:34
von hendrikS
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.
Verfasst: Sonntag 16. August 2009, 10:31
von EyDu
@Pascal: dafür müsstest du aber "funktioniert" ganz neu definieren.
Verfasst: Sonntag 16. August 2009, 18:11
von Pascal
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

Verfasst: Sonntag 16. August 2009, 19:45
von 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.

Verfasst: Montag 17. August 2009, 02:13
von str1442
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.
Verfasst: Dienstag 18. August 2009, 18:24
von Leonidas
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.
Verfasst: Freitag 21. August 2009, 00:08
von str1442
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

Verfasst: Freitag 21. August 2009, 00:20
von Trundle
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.