list remove

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.
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

list remove

Beitragvon lunas » Mittwoch 6. Dezember 2006, 00:58

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
BlackJack

Beitragvon BlackJack » Mittwoch 6. Dezember 2006, 01:16

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.
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Beitragvon lunas » Mittwoch 6. Dezember 2006, 01:39

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder