Un peu plus sur l'approche de l'ensemble. Vous pouvez implémenter un hachage en toute sécurité en déléguant à un hachage de tuple - juste hacher un tuple de tous les attributs que vous voulez regarder. Vous devrez également définir un __eq__
qui se comporte correctement.
class MyClass:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __eq__(self, other):
return (self.a, self.b, self.c) == (other.a, other.b, other.c)
def __hash__(self):
return hash((self.a, self.b, self.c))
def __repr__(self):
return "MyClass({!r}, {!r}, {!r})".format(self.a, self.b, self.c)
Comme vous faites si bien la construction de tuple, vous pouvez simplement faire votre classe itérables:
def __iter__(self):
return iter((self.a, self.b, self.c))
Cela vous permet d'appeler tuple
sur self
au lieu de faire laborieusement .a, .b, .c
etc.
Vous pouvez alors faire quelque chose comme ceci:
def unordered_elim(l):
return list(set(l))
Si vous souhaitez conserver la commande, vous pouvez utiliser un OrderedDict
à la place:
from collections import OrderedDict
def ordered_elim(l):
return list(OrderedDict.fromkeys(l).keys())
Cela devrait être plus rapide que d'utiliser in
ou index
, tout en préservant la commande.Vous pouvez tester quelque chose comme ceci:
data = [MyClass("this", "is a", "duplicate"),
MyClass("first", "unique", "datum"),
MyClass("this", "is a", "duplicate"),
MyClass("second", "unique", "datum")]
print(unordered_elim(data))
print(ordered_elim(data))
Avec cette sortie:
[MyClass('first', 'unique', 'datum'), MyClass('second', 'unique', 'datum'), MyClass('this', 'is a', 'duplicate')]
[MyClass('this', 'is a', 'duplicate'), MyClass('first', 'unique', 'datum'), MyClass('second', 'unique', 'datum')]
NB Si l'un de vos attributs ne sont pas indexables, cela ne fonctionnera pas, et vous aurez besoin soit contournez-le (modifiez une liste en un uplet) ou utilisez une approche lente, comme in
.
Vous pouvez les rendre lavables et ensuite utiliser 'set' pour éliminer les doublons – vaultah
NB: l'approche définie ne conservera aucun ordre dans votre liste. –
Quelle version de Python? –