最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決python中set與dict的無序問題

 更新時(shí)間:2021年03月10日 08:41:22   作者:big蟒蛇  
這篇文章主要介紹了解決python中set與dict的無序問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

每個(gè)熟悉python的人都知道,python提供給了我們各種各樣原生的數(shù)據(jù)結(jié)構(gòu),如list、tuple、set、dict等等。這些形形色色的數(shù)據(jù)結(jié)構(gòu)為我們程序猿提供了業(yè)務(wù)支持。但是要用好這些對象,可就要理解這些結(jié)構(gòu)的特點(diǎn)。

比如簡單的區(qū)分:可變與不可變、有序與無序。

那么本文就想和大家分享一下,這個(gè)無序中的細(xì)節(jié)。

在開始之前,本蟒蛇嚴(yán)重申明,集合和字典是無序的??!集合和字典是無序的?。〖虾妥值涫菬o序的?。〔灰赐瓯旧哒f完,然后得到了什么奇奇怪怪的結(jié)論!本文基于python3.6進(jìn)行講解,什么你還是2.7?兄弟醒醒,都2018年了o(∩_∩)o 哈哈

字典和集合是無序的,只要你懂一點(diǎn)點(diǎn)python的皮毛,你都熟知這句話。大家在初識(shí)python時(shí)就學(xué)習(xí)過,什么是可迭代對象(分清楚這個(gè)多半是想知道到底啥能被for循環(huán)遍歷),什么是可變可迭代對象,什么是不可變可迭代對象,什么是無序什么是有序。但大家有想過證明無序嘛?自然會(huì)想,本蟒蛇也不例外。那么如何證明無序性呢?簡單暴力的解決辦法,隨便寫個(gè)兩行代碼,定義一個(gè)set然后print看結(jié)果唄!

我的測試代碼如下:

s = {'a','b','c'}
print(s)

真的是簡單暴力又直接,看到這兩行代碼不經(jīng)感嘆,人生苦短,我用python(本蟒蛇大學(xué)學(xué)的java)。好了,當(dāng)我瘋狂運(yùn)行這個(gè)程序的時(shí)候輸出結(jié)果自然也不唯一。

無序嘛!就是這個(gè)意思~

但是事情沒有那么簡單,我無意又用int類型試了一試,如下:

s = {1,2,3}
print(s)

猜猜發(fā)生了什么?這種情況下,無論我怎么瘋狂輸出,瘋狂運(yùn)行這段代碼,我得到的結(jié)果卻是唯一的,那就是print了{1,2,3}

通過反復(fù)嘗試我發(fā)現(xiàn),只要是int類型,那么set好像就變成有序了,無論聲明這個(gè)set時(shí)數(shù)字如何擺放,輸出結(jié)果總是以一種固定的順序!同樣我將dict字典的key值設(shè)為int類型,這時(shí)候字典也變成了固定的排序方式。

這是為什么呢?

講到這里,本蛇需要繼續(xù)聲明set和dict是無序的!別懷疑你的專業(yè)知識(shí)。那么為什么出現(xiàn)這種現(xiàn)象呢,答案只需要從底層源碼中就能找到。

簡單來說,就是字典和集合的無序性在python是如何實(shí)現(xiàn)的?

字典和集合無序的實(shí)現(xiàn)方式是hash表。沒錯(cuò),他們是通過hash值來將對象放入hash表中,從而達(dá)到無序的操作(眾所周知對象的hash值是不斷變化的)。

代碼如下:

s = {'A','B','C'}
print(hash('A'))
print(hash('B'))
print(hash('C'))
print(s)

通過打印出hash值,結(jié)果也就一目了然啦~

就像上圖顯示一樣,每次的hash值都不同,那么字符ABC在hash表中的位置也不同,然而set就是依據(jù)hash表來進(jìn)行排列的,這就實(shí)現(xiàn)了集合的無序。

那么同樣的操作我們放在int類型上呢?

s = {1,2,3}
print(hash(1))
print(hash(2))
print(hash(3))
print(s)

到這一步,可能有些猿們就知道結(jié)果了,沒錯(cuò)結(jié)果如下:

無論我多努力的輸出,123的hash值卻那么任性就是123。是的,python中int型的hash值就是它本身,那么set或dict中的排序方式又是通過hash表實(shí)現(xiàn)的,所以自然順序就不會(huì)變。

所以,問題解決啦~就是因?yàn)閔ash的原因,導(dǎo)致了這一怪異現(xiàn)象。提到了hash表不得不佩服python的精妙,dict是原生數(shù)據(jù)結(jié)構(gòu)中常用來儲(chǔ)存大量復(fù)雜數(shù)據(jù)的工具,類似數(shù)據(jù)庫。

這種情況下,查詢效率真的是很關(guān)鍵的存在。利用了hash表,空間換時(shí)間的方式大大提高了查詢效率,妙呀~

所以!不知道大家在做列表隨機(jī)的時(shí)候會(huì)不會(huì)這樣操作,反正本蟒蛇是干過(年少不懂事~),就是類似下面的代碼:

L = ['a','b','c']
L = list(set(L))
print(L)

有沒有??完美!精簡!做隨機(jī)我甚至都沒導(dǎo)入random模塊!在沒有重復(fù)對象的情況下轉(zhuǎn)為集合在轉(zhuǎn)回來不就隨機(jī)了嘛~那么通過上面的分析,當(dāng)出現(xiàn)int類型時(shí)這個(gè)隨機(jī)就失去了意義啦~避免這樣使用喲。而且在真正的生產(chǎn)過程中,你用到列表隨機(jī)說明就有重復(fù)值呀~如果沒有。。為什么不直接就用set呢。。。Σ( ° △ °|||)︴可別忘了set還帶去重呢!

所以!記住set是無序的!也千萬別鉆int值是有序的這個(gè)空子!因?yàn)楹唵蔚恼f,我運(yùn)行時(shí)是CPython作為解釋器的,別的結(jié)果可能不一樣喲~而且python是一門膠水語言,百搭的中央空調(diào),和什么都能配~所以不能保證你的代碼絕對只用cPython作為解釋器。

所以set與dict是無序的~但是無序的世界里也有小驚喜等著我們發(fā)現(xiàn)~

補(bǔ)充:Python中關(guān)于dict和set的比較

語法 dict set
定義 通過鍵-值儲(chǔ)存的字典 只儲(chǔ)存list值的集合
性質(zhì) 鍵和值一一對應(yīng) 儲(chǔ)存的值不能重復(fù)
用法 存入:字典名[‘鍵'] = 值 刪除:字典名.pop(‘鍵') 替換:字典名[‘鍵'] = 新值 存入集合名.add(內(nèi)容) 刪除:集合名.remove(值) 交并補(bǔ)運(yùn)算:

共同點(diǎn):

set的原理和dict一樣,所以,同樣不可以放入可變對象,因?yàn)闊o法判斷兩個(gè)可變對象是否相等,也就無法保證set內(nèi)部“不會(huì)有重復(fù)元素”。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 梅爾倒譜系數(shù)(MFCC)實(shí)現(xiàn)

    梅爾倒譜系數(shù)(MFCC)實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了梅爾倒譜系數(shù)(MFCC)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Pandas實(shí)現(xiàn)Dataframe的重排和旋轉(zhuǎn)

    Pandas實(shí)現(xiàn)Dataframe的重排和旋轉(zhuǎn)

    使用Pandas的pivot方法可以將DF進(jìn)行旋轉(zhuǎn)變換,本文將會(huì)詳細(xì)講解pivot的秘密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • pytorch程序異常后刪除占用的顯存操作

    pytorch程序異常后刪除占用的顯存操作

    今天小編就為大家分享一篇pytorch程序異常后刪除占用的顯存操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼

    Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼

    這篇文章主要介紹了Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • python使用pycharm環(huán)境調(diào)用opencv庫

    python使用pycharm環(huán)境調(diào)用opencv庫

    這篇文章主要介紹了python使用pycharm環(huán)境調(diào)用opencv庫,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • python運(yùn)行加速的幾種方式

    python運(yùn)行加速的幾種方式

    Python運(yùn)行的慢是歷來被詬病的,本文就來介紹一下python運(yùn)行加速的幾種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • np.newaxis()函數(shù)的具體使用

    np.newaxis()函數(shù)的具體使用

    本文主要介紹了np.newaxis()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python裝飾器結(jié)合遞歸原理解析

    Python裝飾器結(jié)合遞歸原理解析

    這篇文章主要介紹了Python裝飾器結(jié)合遞歸原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • django如何實(shí)現(xiàn)用戶的注冊、登錄、注銷功能

    django如何實(shí)現(xiàn)用戶的注冊、登錄、注銷功能

    本文詳細(xì)介紹了創(chuàng)建Django項(xiàng)目的步驟,包括配置數(shù)據(jù)庫、編寫用戶模型、創(chuàng)建遷移文件、編寫表單校驗(yàn)、編寫前端頁面、編寫視圖類、編寫路由、使用Django自帶的管理后臺(tái)以及具體的文件結(jié)構(gòu),通過這些步驟,可以實(shí)現(xiàn)一個(gè)基本的Django項(xiàng)目
    2025-01-01
  • 關(guān)于Java中RabbitMQ的高級特性

    關(guān)于Java中RabbitMQ的高級特性

    這篇文章主要介紹了關(guān)于Java中RabbitMQ的高級特性,MQ全稱為Message Queue,即消息隊(duì)列,"消息隊(duì)列"是在消息的傳輸過程中保存消息的容器,它是典型的:生產(chǎn)者、消費(fèi)者模型,生產(chǎn)者不斷向消息隊(duì)列中生產(chǎn)消息,消費(fèi)者不斷的從隊(duì)列中獲取消息,需要的朋友可以參考下
    2023-07-07

最新評論

太和县| 白河县| 蓝山县| 青岛市| 曲阳县| 平潭县| 耒阳市| 丹巴县| 平果县| 丹江口市| 大荔县| 房产| 汉川市| 永康市| 苗栗市| 九江市| 新和县| 蒙山县| 综艺| 龙海市| 扎赉特旗| 鄯善县| 宁德市| 出国| 东阳市| 广州市| 永登县| 隆化县| 弋阳县| 错那县| 南部县| 楚雄市| 元氏县| 崇礼县| 大兴区| 滁州市| 吕梁市| 湛江市| 会东县| 白银市| 霸州市|