更多关于设置的方法。您可以通过委托给元组的散列来安全地实现散列 - 只需散列您想要查看的所有属性的元组即可。您还需要定义行为正确的__eq__
。
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)
当你做了这么多的元组建筑,你可以只让你的类迭代:
def __iter__(self):
return iter((self.a, self.b, self.c))
这使您可以致电self
tuple
,而不是费力地做.a, .b, .c
等
然后你可以这样做:
def unordered_elim(l):
return list(set(l))
如果您想保留订购,您可以使用一个OrderedDict
代替:
from collections import OrderedDict
def ordered_elim(l):
return list(OrderedDict.fromkeys(l).keys())
这应该是比使用in
或index
,同时仍保留排序更快。您可以测试它是这样的:
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))
有了这个输出:
[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,如果你的任何属性都没有哈希的,这是行不通的,而你要么需要解决它(将列表更改为元组)或使用像in
这样的缓慢的n^2
方法。
你可以让它们变成可散列的,然后使用'set'来消除重复项。 – vaultah
注意:set方法不会保留你列表中的任何顺序。 –
什么版本的Python? –