电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

解決python中set與dict的無(wú)序問(wèn)題

瀏覽:31日期:2022-06-25 16:41:03

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

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

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

在開(kāi)始之前,本蟒蛇嚴(yán)重申明,集合和字典是無(wú)序的!!集合和字典是無(wú)序的!!集合和字典是無(wú)序的!!不要看完本蛇說(shuō)完,然后得到了什么奇奇怪怪的結(jié)論!本文基于python3.6進(jìn)行講解,什么你還是2.7?兄弟醒醒,都2018年了o(∩_∩)o 哈哈

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

我的測(cè)試代碼如下:

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

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

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

解決python中set與dict的無(wú)序問(wèn)題

但是事情沒(méi)有那么簡(jiǎn)單,我無(wú)意又用int類(lèi)型試了一試,如下:

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

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

解決python中set與dict的無(wú)序問(wèn)題

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

這是為什么呢?

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

簡(jiǎn)單來(lái)說(shuō),就是字典和集合的無(wú)序性在python是如何實(shí)現(xiàn)的?

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

代碼如下:

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

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

解決python中set與dict的無(wú)序問(wèn)題

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

那么同樣的操作我們放在int類(lèi)型上呢?

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

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

解決python中set與dict的無(wú)序問(wèn)題

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

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

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

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

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

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

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

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

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

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

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

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 安规电容|薄膜电容|陶瓷电容|智旭JEC安规电容厂家 | OpenI 启智 新一代人工智能开源开放平台| 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 123悬赏网_发布悬赏任务_广告任务平台 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 国产液相色谱仪-超高效液相色谱仪厂家-上海伍丰科学仪器有限公司 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 快速门厂家-快速卷帘门-工业快速门-硬质快速门-西朗门业 | 三防漆–水性三防漆–水性浸渍漆–贝塔三防漆厂家 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | 合肥礼品公司-合肥礼品定制-商务礼品定制公司-安徽柏榽商贸有限公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 全自动面膜机_面膜折叠机价格_面膜灌装机定制_高速折棉机厂家-深圳市益豪科技有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 间甲酚,间甲酚厂家-山东祥东新材料 | 影合社-影视人的内容合作平台 |