numpy.unique
ist nicht das beste Werkzeug für benutzerdefinierte Klassen. Machen Sie Ihre Instanzen hashable (implementierende __hash__
und __eq__
), dann einen Satz verwenden, um eine Liste der Instanzen auf eindeutige Werte zu reduzieren:
class structure:
def __init__(self, handle):
self.handle = handle
def __hash__(self):
return hash(self.handle)
def __eq__(self, other):
if not isinstance(other, structure):
# only equality tests to other `structure` instances are supported
return NotImplemented
return self.handle == other.handle
Sets effizient Duplikate über den Hash erkennen kann, was bestätigt, dass die Objekte mit dem gleichen Hash sind auch gleich zuerst.
Um die eindeutigen Instanzen zu erhalten, einfach set()
auf einer Folge von Instanzen nennen:
unique_structures = set(list_of_structures)
Demo:
>>> class structure:
... def __init__(self, handle):
... self.handle = handle
... def __hash__(self):
... return hash(self.handle)
... def __eq__(self, other):
... if not isinstance(other, structure):
... # only equality tests to other `structure` instances are supported
... return NotImplemented
... return self.handle == other.handle
... def __repr__(self):
... return '<structure({!r})>'.format(self.handle)
...
>>> list_of_structures = [structure('foo'), structure('bar'), structure('foo'), structure('spam'), structure('spam')]
>>> set(list_of_structures)
{<structure('bar')>, <structure('foo')>, <structure('spam')>}
in Betracht zu nehmen, dass der Hash jeder structure
Instanz in einem Satz gespeichert oder verwendet einen Wörterbuchschlüssel darf nicht geändert werden; Das handle
Attribut während der Lebensdauer einer Instanz nicht zu ändern ist der einfachste Weg, dies sicherzustellen.
Möchten Sie die Werte für Handle oder die Instanzen? Wenn Sie möchten, dass die Instanzen und zwei Instanzen denselben Wert für handle haben, was sollte gewählt werden? – snakecharmerb