更多關於設置的方法。您可以通過委託給元組的散列來安全地實現散列 - 只需散列您想要查看的所有屬性的元組即可。您還需要定義行爲正確的__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? –