python set()去重的底層原理
一、set去重簡單實例
ls = [1,2,3,1,2] print(set(ls))
我們知道對於一個列表最簡單的去重方法就是直接調用set函數,利用集合元素的唯一性,就可以做到去重。但是,這個底層原理究竟是什麼樣的卻一直半解。
且看下面剖析
二、重新set實現機制
class Foo: def __init__(self,name,count): self.name = name self.count = count def __hash__(self): print("%s調用瞭哈希方法"%self.name) return hash(id(self)) def __eq__(self, other): print("%s調用瞭eq方法") if self.__dict__ == other.__dict__: return True else:return False f1 = Foo('f1',1) f2 = Foo('f2',2) f3 = Foo('f3',3) ls = [f1,f2,f3] print(set(ls))
從上面可以看出,set方法就是去調用hash方法,然後根據哈希值一不一樣就行去重判斷,但是事實就是樣嗎?且看下面程序。
class Foo: def __init__(self,name,count): self.name = name self.count = count def __hash__(self): print("%s調用瞭哈希方法"%self.name) return hash(self.count) def __eq__(self, other): print("%s調用瞭eq方法"%self.name) return self.__dict__ == other.__dict__ f1 = Foo('f1',1) f2 = Foo('f2',1) f3 = Foo('f3',3) ls = [f1,f2,f3] print(set(ls))
我看可以看出,實際上f1,f3的哈希值是相等的,但是set並沒有這麼簡單就判斷f1,f3是重復的,而是進一步通過eq方法判斷這兩個值是否相等,隻有相等時才會認為這兩個之間實際上是同一個。為瞭驗證上面的說法,我們來看看下面的代碼。
f1 = Foo('f1',1) f2 = Foo('f1',1) f3 = Foo('f3',3) ls = [f1,f2,f3] print(set(ls))
可以看出去重後,隻有兩個元素,所以上面說法得證。
三、結論
set的去重是通過兩個函數__hash__和__eq__結合實現的。
1、當兩個變量的哈希值不相同時,就認為這兩個變量是不同的
2、當兩個變量哈希值一樣時,調用__eq__方法,當返回值為True時認為這兩個變量是同一個,應該去除一個。返回FALSE時,不去重
四、應用場景需求
有一個公司,現有100個員工,由於數據庫不完善,使用時間比較長,裡面有很多重復數據需要清除。具體需求如下:
每個員工的屬性有:姓名,性別,年齡,部門。 由於年齡和部門都會發生變化,所以現在認為隻要兩個員工之間姓名和性別一樣,就認為是同一個人。
請實現員工去重:
class Staff: def __init__(self,name,gender,age,department): self.name = name self.gender = gender self.age = age self.department = department def __hash__(self): return hash(self.name+self.gender) def __eq__(self, other): return True ls = ['zs','ls','ww','zq'] gender_list = ['man','femal'] staff_list = [] for i in range(100): staff_list.append(Staff(ls[i%4],gender_list[i%2],i,'class')) print(set(staff_list)) print([(i.name,i.gender) for i in set(staff_list)])
到此這篇關於python set()去重的底層原理的文章就介紹到這瞭,更多相關python set()去重內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python序列的推導式實現代碼
- python 特殊屬性及方法詳細解析
- python全面解析接口返回數據
- Python中三個不可思議的返回功能分享
- python進階從青銅到王者一定會用上的Python技巧