python set 去重的底層原理

2021-10-09 06:32:18 字數 3170 閱讀 4695

一、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,...