一、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方法"
從上面可以看出,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方法"
我看可以看出,實際上f1,f3的雜湊值是相等的,但是set並沒有這麼簡單就判斷f1,f3是重複的,而是進一步通過eq方法判斷這兩個值是否相等,只有相等時才會認為這兩個之間實際上是同乙個。為了驗證上面的說法,我們來看看下面的**。
可以看出去重後,只有兩個元素,所以上面說法得證。
三、結論
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):
4],gender_list[i%2]
,i,'class'))
print
(set
(staff_list)
)print([
(i.name,i.gender)
for i in
set(staff_list)
])
python的set去重原理 Set去重原理
在上篇文章 雜湊值和可變性hash value and mutability 最後說到set去重問題,所以這篇主要是通過實踐來研究一下set去重背後的故事,當然也是參考了網上一些資料得到了一些啟發,感謝那些陌生的喜歡分享的博友們。set的簡單應用 利用set中元素的唯一性,我們可以對list去重 l...
原 js陣列物件去重最簡單的方法
簡單的陣列去重是比較簡單的,方法也特別多,如給下面的陣列去重 let arr 1,2,2,4,9,6,7,5,2,3,5,6,5 最常用的可以用for迴圈套for迴圈,再用splice刪除重複的陣列 let arrunique function arr return arr 然而陣列的子集為物件時,...
陣列的去重
陣列去重 1 var arr 4,2,5,7,2,6,2,6,6,5 console.log arr 使用迴圈依次比較,遇到重複的就刪除 比較length 1趟 for var i 0 i arr.length 1 i console.log arr 2 var arr 4,2,4,5,7,2,6,...