溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python?set()去重的方法是什么

發布時間:2022-01-10 08:05:40 來源:億速云 閱讀:305 作者:iii 欄目:開發技術

這篇文章主要介紹了python set()去重的方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇python set()去重的方法是什么文章都會有所收獲,下面我們一起來看看吧。

set是什么?

數學上,把set稱做由不同的元素組成的集合,集合(set)的成員通常被稱做集合元素(set elements)。Python把這個概念引入到它的集合類型對象里。集合對象是一組無序排列的可哈希的值。集合關系測試和union、intersection等操作符在Python里也同樣如我們所預想地那樣工作。

set特點

集合的元素有三個特征:

1.確定性:集合中的元素必須是確定的;

2.互異性:集合中的元素互不相同,如:集合A={1,a},則a不能等于1);

3.無序性:集合中的元素沒有先后之分,如:{3,4,5}和{3,5,4}算作同一個集合。

python中集合(set)是一個無序不重復元素的集,基本功能包括關系測試和消除重復元素,還可以計算交集、差集、并集等,它與列表(list)的行為類似,區別在于set不同包括重復的值,而且set元素是無序的。

在python中可以用大括號 {} 創建集合。注意:如果要創建或初始化一個空集合,你必須用 set() 而不是 {} 。因為后者{} 作為創建一個空的字典,以后我們會介紹字典這種數據結構。

一、set去重簡單實例

ls = [1,2,3,1,2]
print(set(ls))

python?set()去重的方法是什么

我們知道對于一個列表最簡單的去重方法就是直接調用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))

python?set()去重的方法是什么

從上面可以看出,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))

python?set()去重的方法是什么

我看可以看出,實際上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))

python?set()去重的方法是什么

可以看出去重后,只有兩個元素,所以上面說法得證。

三、結論

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()去重的方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女