@narpfel: Ich weiss jetzt nicht was Du damit sagen willst? ``==`` vegleicht ja nicht die ganze Liste sondern nur einen Knoten. Das halt nur anhand des Wertes und das soll und muss auch so. Das `next` (`nachfolger`) von dem Vergleich ausgenommen ist, braucht man dann in der `equals()`-Methode (`gleich()`) die laut Aufgabenstellung implementiert werden soll. Die habe ich noch nicht gezeigt, weil das ja noch eine offene Aufgabe für d_rose ist. Also man braucht es nicht zwingend, aber es macht den Code einfacher wenn man in der `equals()` einfach ``==`` auf den Knoten verwenden kann ohne prüfen zu müssen ob der Knoten eventuell `None` ist, weil man *da* ja nicht auf das `value`/`eintrag`-Attribut zugreifen kann.
Edit: Obwohl die Lösung ja sowieso nicht so einfach 1:1 übernommen werden kann, also hier ist die `equals()` für die ich die Änderung an den Vergleichen gemacht hatte:
Code: Alles auswählen
from itertools import takewhile, zip_longest
from operator import attrgetter
from attr import attrib, attrs
from more_itertools import iterate
@attrs
class LinkedList:
value = attrib()
next = attrib(default=None, cmp=False)
def __iter__(self):
return takewhile(bool, iterate(attrgetter('next'), self))
def equals(self, other):
return all(a == b for a, b in zip_longest(self, other))
Ohne könnte man die einzelnen Knoten nicht einfach mit ``a == b`` vergleichen, sondern müsste dort explizit `a` und `b` gegen `None` prüfen bevor man deren `value`-Attribute vergleicht.
Edit2: Alternativ, wenn man tatsächlich den ``==``-Operator überschreiben wollte, müsste es so aussehen:
Code: Alles auswählen
@attrs
class LinkedList:
value = attrib()
next = attrib(default=None)
def __iter__(self):
return takewhile(bool, iterate(attrgetter('next'), self))
def __eq__(self, other):
return all(
a and b and a.value == b.value for a, b in zip_longest(self, other)
)
def __ne__(self, other):
return not self == other
def __hash__(self):
raise TypeError(f'unhashable type: {self.__class__.__name__!r}')