Hallo Leute!

Ich habe ein kleines Problem, ich kann das Problem nicht mündlich erklären, also werde ich nur versuchen, es im Code zu veranschaulichen:

class move(object):
    def __init__(self, number):
        self.number = number

list1 = [move(1), move(2), move(3), move(4)]
list2 = [move(3), move(7)]

list1.remove(list2[0])

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    list1.remove(list2[0])
ValueError: list.remove(x): x not in list

Wie Sie sehen können, sind list1 [2] und list2 [0] beide von derselben Klasse abgeleitet und haben genau dieselben Attribute. Sie sind nur zwei verschiedene Instanzen dieser Klasse

Was ist die optimale Lösung für dieses Problem?

Vielen Dank für Ihre Hilfe!

1
stensootla 8 Okt. 2012 im 13:46

3 Antworten

Beste Antwort

Sie sollten das __eq__ Ihrer Klasse überschreiben, um Python mitzuteilen, dass zwei Klassen gleich sind, wenn ihre Anzahl gleich ist:

class move(object):
    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return self.number == other.number
5
Rob Wouters 8 Okt. 2012 im 09:50

Wenn Sie Wert auf Leistung legen, können Sie diesen Fall verwenden:

class move(int):
    pass # you can add new attrs and methods 


list1 = [move(1), move(2), move(3), move(4)]
list2 = [move(3), move(7)]

list1.remove(list2[0])

print list1 # [1, 2, 4]
0
defuz 8 Okt. 2012 im 10:01

Wenn Ihr Move Datentyp unveränderlich sein soll, ist es besser, namedtuple zu verwenden, die ziemlich knapp zu definieren sind, und Sie erhalten eine kostenlose Gleichstellungsimplementierung.

>>> from collections import namedtuple
>>> Move = namedtuple('Move', 'number')
>>> list1 = [Move(2), Move(3), Move(7)]
>>> list2 = [Move(3), Move(7)]
>>> 
>>> list1.remove(list2[0])
>>> list1
[Move(number=2), Move(number=7)]
0
missingfaktor 8 Okt. 2012 im 11:32