欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python?set()去重的底層原理及實(shí)例

 更新時間:2022年01月08日 10:11:18   作者:喲,寫bug呢??  
python中集合set是一個無序不重復(fù)元素的集,基本功能包括關(guān)系測試和消除重復(fù)元素,還可以計(jì)算交集、差集、并集等,它與列表(list)的行為類似,這篇文章主要介紹了python?set()去重的底層原理,需要的朋友可以參考下

set是什么?

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

set特點(diǎn)

集合的元素有三個特征:

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

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

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

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

在python中可以用大括號 {} 創(chuàng)建集合。注意:如果要創(chuàng)建或初始化一個空集合,你必須用 set() 而不是 {} 。因?yàn)楹笳遻} 作為創(chuàng)建一個空的字典,以后我們會介紹字典這種數(shù)據(jù)結(jié)構(gòu)。

一、set去重簡單實(shí)例

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

我們知道對于一個列表最簡單的去重方法就是直接調(diào)用set函數(shù),利用集合元素的唯一性,就可以做到去重。但是,這個底層原理究竟是什么樣的卻一直半解。

且看下面剖析

二、重新set實(shí)現(xiàn)機(jī)制

class Foo:
    def __init__(self,name,count):
        self.name = name
        self.count = count
    def __hash__(self):
        print("%s調(diào)用了哈希方法"%self.name)
        return hash(id(self))
    def __eq__(self, other):
        print("%s調(diào)用了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方法就是去調(diào)用hash方法,然后根據(jù)哈希值一不一樣就行去重判斷,但是事實(shí)就是樣嗎?且看下面程序。

class Foo:
    def __init__(self,name,count):
        self.name = name
        self.count = count
    def __hash__(self):
        print("%s調(diào)用了哈希方法"%self.name)
        return hash(self.count)
    def __eq__(self, other):
        print("%s調(diào)用了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))

我看可以看出,實(shí)際上f1,f3的哈希值是相等的,但是set并沒有這么簡單就判斷f1,f3是重復(fù)的,而是進(jìn)一步通過eq方法判斷這兩個值是否相等,只有相等時才會認(rèn)為這兩個之間實(shí)際上是同一個。為了驗(yàn)證上面的說法,我們來看看下面的代碼。

f1 = Foo('f1',1)
f2 = Foo('f1',1)
f3 = Foo('f3',3)
ls = [f1,f2,f3]
print(set(ls))

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

三、結(jié)論

set的去重是通過兩個函數(shù)__hash__和__eq__結(jié)合實(shí)現(xiàn)的。
1、當(dāng)兩個變量的哈希值不相同時,就認(rèn)為這兩個變量是不同的
2、當(dāng)兩個變量哈希值一樣時,調(diào)用__eq__方法,當(dāng)返回值為True時認(rèn)為這兩個變量是同一個,應(yīng)該去除一個。返回FALSE時,不去重

四、應(yīng)用場景需求

有一個公司,現(xiàn)有100個員工,由于數(shù)據(jù)庫不完善,使用時間比較長,里面有很多重復(fù)數(shù)據(jù)需要清除。具體需求如下:

每個員工的屬性有:姓名,性別,年齡,部門。 由于年齡和部門都會發(fā)生變化,所以現(xiàn)在認(rèn)為只要兩個員工之間姓名和性別一樣,就認(rèn)為是同一個人。

請實(shí)現(xiàn)員工去重:

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)])

到此這篇關(guān)于python set()去重的底層原理的文章就介紹到這了,更多相關(guān)python set()去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV實(shí)現(xiàn)直線檢測

    OpenCV實(shí)現(xiàn)直線檢測

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)直線檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • PyCharm使用教程之搭建Python開發(fā)環(huán)境

    PyCharm使用教程之搭建Python開發(fā)環(huán)境

    由于python的跨平臺性。在windows下和ubuntu下基本上沒什么差別。下面從幾個不步驟來搭建開發(fā)環(huán)境。
    2016-06-06
  • python如何按照自己順序讀出文件名

    python如何按照自己順序讀出文件名

    這篇文章主要介紹了python如何按照自己順序讀出文件名問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python爬取全國水雨情信息詳解

    python爬取全國水雨情信息詳解

    這篇文章主要為大家詳細(xì)介紹了python爬取全國水雨情信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • python3使用tkinter實(shí)現(xiàn)ui界面簡單實(shí)例

    python3使用tkinter實(shí)現(xiàn)ui界面簡單實(shí)例

    使用tkinter創(chuàng)建一個小窗口,布置2個按鈕,一個btn關(guān)閉窗口,另一個btn用于切換執(zhí)行傳入的2個函數(shù),簡單的小代碼,大家參考使用吧
    2014-01-01
  • 基于Python實(shí)現(xiàn)英語單詞小游戲

    基于Python實(shí)現(xiàn)英語單詞小游戲

    這篇文章主要為大家詳細(xì)介紹了如何通過Python實(shí)現(xiàn)一個簡單的英語單詞小游戲,四級考滿分的學(xué)姐告訴你這樣學(xué)英語逢考必過,趕緊康康叭
    2022-11-11
  • 機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)之間的區(qū)別和聯(lián)系

    機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)之間的區(qū)別和聯(lián)系

    機(jī)器學(xué)習(xí)>神經(jīng)網(wǎng)絡(luò)>深度學(xué)習(xí)≈深度神經(jīng)網(wǎng)絡(luò),機(jī)器學(xué)習(xí)包括了神經(jīng)網(wǎng)絡(luò)在內(nèi)的許多算法,而神經(jīng)網(wǎng)絡(luò)又可以分為淺度神經(jīng)網(wǎng)絡(luò)和深度神經(jīng)網(wǎng)絡(luò),深度學(xué)習(xí)是使用了深度神經(jīng)網(wǎng)絡(luò)的技術(shù),雖然機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)是不同的,但在構(gòu)建復(fù)雜系統(tǒng)時,許多相關(guān)概念是混合在一起的
    2024-02-02
  • 推薦一款高效的python數(shù)據(jù)框處理工具Sidetable

    推薦一款高效的python數(shù)據(jù)框處理工具Sidetable

    這篇文章主要為大家介紹推薦一款高效的python數(shù)據(jù)框處理工具Sidetable,文章詳細(xì)的講解了Sidetable的安裝及用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • 解決pytorch rnn 變長輸入序列的問題

    解決pytorch rnn 變長輸入序列的問題

    這篇文章主要介紹了解決pytorch rnn 變長輸入序列的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python Dataframe 合并與去重詳情

    python Dataframe 合并與去重詳情

    這篇文章主要介紹了python Dataframe 合并與去重詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定參考價值,需要的朋友可以參考一下
    2022-08-08

最新評論