Seite 1 von 1

list remove

Verfasst: Mittwoch 6. Dezember 2006, 00:58
von lunas
Hi,

ich stehe vor einem kleinen Mysterium... Aus einer Listr, die Objekte enthält, möchte ich einzelne Einträge löschen, sofern vorhanden. Wenn die Liste strings enthält ist das auch kein Problem, aber so wie ich sie mit eigenen Objekten fülle, passieren seltsame Dinge...

Hier der Code:

Code: Alles auswählen


class M:
	def __init__( self, num ):
		self.num = num

	# irgend eine string repraesentation
	def __str__( self ):
		if self.num == 1:
			return '1'
		elif self.num == 2:
			return '2'
		elif self.num == 3:
			return '3'

	def __cmp__( self, other ):
		return str( self ) == str( other )
		

orig = [M(1),M(2),M(3)]

for o in orig:
	print 'lst ', o
print '\n'

orig.remove( M(3) )
for o in orig:
	print 'lst ', o
print '\n'

orig.remove( M(1) )
for o in orig:
	print 'lst ', o
print '\n'

orig.remove( M(2) )
for o in orig:
	print 'lst ', o
print '\n'

orig.remove( M(0) )
for o in orig:
	print 'lst ', o
print '\n'
Das Ergebnis auf der Konsole sieht dann so aus:

Code: Alles auswählen

lst  1
lst  2
lst  3


lst  2
lst  3


lst  3




Traceback (most recent call last):
  File "main.py", line 216, in <module>
    orig.remove( M(0) )
ValueError: list.remove(x): x not in list
Scheinbar löscht remove() immer nur das erste Element und nicht das übergebene. Wenn ich __cmp__ nicht überlade, dann wird gar nichts gelöscht und schon beim ersten versuch wird eine Exception geworfen (was mir auch klar ist, da es sich um Objektreferenzen handelt, die ungleich sind).

Weiß jemand wie sich das gewünschte Objekt aus der Liste löschen lässt?

lg lunas

Verfasst: Mittwoch 6. Dezember 2006, 01:16
von BlackJack
Du hast `__cmp__()` falsch implementiert. Entweder Du benennst `__cmp__()` in `__eq__()` um, dann tut der Code das richtige, oder Du änderst den Code von `__cmp__()` damit er sich so verhält wie es von ihm erwartet wird.

`__cmp__()` ist kein einfacher Vergleich auf (Un)Gleichheit sondern definiert eine Ordnung auf den Objekten. Der Rückgabewert ist eine ganze Zahl die negativ ist, wenn `self` < `other`, 0 wenn `self` == `other` und positiv wenn `self` > `other` gilt.

Noch ein Tip: Wenn Du die `repr()`-Methode entsprechend überschreibst, brauchst Du die Listenelemente nicht einzeln ausgeben, sondern kannst die Liste als ganzes ausgeben um zu sehen was passiert.

Verfasst: Mittwoch 6. Dezember 2006, 01:39
von lunas
Danke, das hat geholfen.
BlackJack hat geschrieben:Noch ein Tip: Wenn Du die `repr()`-Methode entsprechend überschreibst, brauchst Du die Listenelemente nicht einzeln ausgeben, sondern kannst die Liste als ganzes ausgeben um zu sehen was passiert.
Wieder etwas dazu gelernt (muss übrigens __repr__() überladen werden). Auch hierfür besten Dank.