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

Python字典和集合的底層原來(lái)是這么玩的

 更新時(shí)間:2026年06月02日 08:20:08   作者:To_OC  
在Python算法競(jìng)賽中,集合(set)和字典(dict)是兩個(gè)高頻使用的內(nèi)置數(shù)據(jù)結(jié)構(gòu),二者分工明確,這篇文章主要介紹了Python字典和集合底層的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

昨天寫 Python 小腳本,腦子一抽想把列表當(dāng)成字典的 key 存數(shù)據(jù),敲完回車控制臺(tái)直接甩來(lái)一個(gè)報(bào)錯(cuò),當(dāng)時(shí)我人都傻了,盯著屏幕看了半天,愣是沒明白為啥字符串能當(dāng) key,列表就不行。

截圖就是當(dāng)時(shí)控制臺(tái)報(bào)的 unhashable type: 'list',就是這行破代碼,逼得我把字典、哈希表、可變不可變對(duì)象全啃了一遍。

說(shuō)實(shí)話,我之前對(duì)字典的理解就停留在 “存鍵值對(duì)的容器”,啥底層原理、使用限制一概不知,這次踩坑后才算真的吃透,趁熱乎把我的思考過(guò)程分享給大家。

先搞懂:字典為啥比列表快到飛起?

最開始我存「名字 - 成績(jī)」,用的是最笨的原始方法:

# 兩個(gè)列表,下標(biāo)一一對(duì)應(yīng),純純笨方法
names = ['周杰倫', '蔡徐坤', '周星馳']
score = [100, 2.5, 100]

# 想查蔡徐坤的分?jǐn)?shù)?得遍歷列表找下標(biāo),數(shù)據(jù)多了直接慢死

這就是列表的硬傷:查找、插入的速度會(huì)跟著元素變多越來(lái)越慢。

然后 Python 的字典就登場(chǎng)了,我給它打個(gè)最貼切的比方:字典就是書本最前面的索引目錄。你想找某一頁(yè)內(nèi)容,不用從頭翻到尾,看目錄直接定位頁(yè)碼;字典底層是哈希表,key 通過(guò)哈希算法算出一個(gè)唯一的索引,直接找到 value 的存儲(chǔ)地址,所以查找速度是 O (1),不管多少數(shù)據(jù),都是秒查。

這才是字典的正確打開方式:

    # 字python典:key-value鍵值對(duì)
    d = {'周杰倫': 100, '蔡徐坤': 2.5, '周星馳': 100}
    # 直接查找,瞬間出結(jié)果
    print(d['蔡徐坤'])  # 2.5

日常用字典的增刪改查,我也把踩過(guò)的小坑整理好了:

    # 1. 修改已有的key
    d['周杰倫'] = 88
    print(d['周杰倫'])  # 88

    # 2. 千萬(wàn)別直接訪問不存在的key!會(huì)直接報(bào)錯(cuò)
    # d['ikun']  # KeyError,血的教訓(xùn)

    # 3. 安全訪問:用in判斷 / get方法
    print('ikun' in d)  # False
    print(d.get('ikun'))  # None,不報(bào)錯(cuò)
    print(d.get('ikun', -1))  # 可以指定默認(rèn)值,太香了
    print(d.get('蔡徐坤', -1))  # 2.5

    # 4. 刪除key
    d.pop('蔡徐坤')

核心大坑:為啥列表絕對(duì)不能當(dāng)字典的 key?

繞回最開始的報(bào)錯(cuò),我第一反應(yīng)是:“Python 歧視列表?憑啥字符串就行?”后來(lái)翻了哈希表的設(shè)計(jì)規(guī)則,才恍然大悟:字典的 key 必須是可哈希的,也就是不可變類型。

哈希算法的硬性要求:key 必須固定不變!如果 key 是可變的(比如列表),你改一下列表內(nèi)容,哈希計(jì)算的結(jié)果就變了,字典直接找不到 value 的位置,整個(gè)哈希表就亂套了。

字符串、數(shù)字、元組是不可變的,所以能當(dāng) key;列表、字典是可變的,Python 直接禁止它們當(dāng)字典的 key。

順便記一下字典的優(yōu)缺點(diǎn),別把它當(dāng)萬(wàn)能藥:

  • 優(yōu)點(diǎn):查找、插入極快,不隨元素增多變慢
  • 缺點(diǎn):占用內(nèi)存大,典型的空間換時(shí)間

秒懂 Set:就是個(gè)沒有 value 的字典

搞懂字典后,看 Set 集合簡(jiǎn)直是降維打擊!Set 和字典的底層原理一模一樣,唯一區(qū)別:Set 只存 key,不存 value,而且 key 不能重復(fù),天生自帶去重功能。

直接上可運(yùn)行的 demo:

    # 兩種創(chuàng)建set的方式
    s = {1, 2, 3}
    # 列表轉(zhuǎn)set,自動(dòng)去重
    s = set([1,2,3,2,5])
    print(s)  # {1,2,3,5}

    # 增刪元素
    s.add(4)
    s.remove(4)

    # 集合運(yùn)算:交集、并集,處理數(shù)據(jù)超好用
    s1 = {1, 2, 3}
    s2 = {2, 3, 4}
    print(s1 & s2)  # 交集 {2,3}
    print(s1 | s2)  # 并集 {1,2,3,4}

終極迷惑:可變對(duì)象 vs 不可變對(duì)象

本來(lái)以為字典搞定就收工了,結(jié)果又被列表sort和字符串replace坑了一把,這倆的效果完全不一樣!

    # 列表:可變對(duì)象
    a = ['c', 'b', 'a']
    print(a.sort())  # None!坑!sort直接修改原列表,不返回新對(duì)象
    print(a)  # ['a', 'b', 'c']

    # 字符串:不可變對(duì)象
    str_obj = 'abc'
    # replace不會(huì)改原字符串,只會(huì)返回新的字符串!
    print(str_obj.replace('a', 'A'))  # Abc
    print(str_obj)  # abc 原對(duì)象紋絲不動(dòng)

現(xiàn)在徹底理清了:

  • 可變對(duì)象(list、dict、set):調(diào)用方法會(huì)直接修改自身
  • 不可變對(duì)象(str、數(shù)字、元組):調(diào)用方法只會(huì)返回新對(duì)象,原數(shù)據(jù)永遠(yuǎn)不變

寫在最后

這次從一個(gè)報(bào)錯(cuò)啃完所有知識(shí)點(diǎn),腦子里就刻下了三個(gè)核心:

  1. 字典底層是哈希表,靠 key 哈希定位 value,key 必須是不可變類型
  2. 可變 / 不可變對(duì)象是核心,別再搞混sortreplace的效果
  3. Set 就是精簡(jiǎn)版字典,專門用來(lái)去重、做集合運(yùn)算

也別神話字典,小數(shù)據(jù)量、不需要快速查找的場(chǎng)景,用列表更省內(nèi)存。

這次踩坑爬坑的過(guò)程還挺有意思的。

到此這篇關(guān)于Python字典和集合底層的文章就介紹到這了,更多相關(guān)Python字典和集合底層內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Notepad 輕量級(jí)文本編輯器的安裝及基本使用

    Notepad 輕量級(jí)文本編輯器的安裝及基本使用

    notepad–是一個(gè)國(guó)產(chǎn)跨平臺(tái)、輕量級(jí)的文本編輯器,是替換notepad++的一種選擇,notepad特點(diǎn)支持Window/Mac/Linux操作系統(tǒng)平臺(tái),支持其他notepad競(jìng)品的常用功能,這篇文章給大家介紹Notepad 輕量級(jí)文本編輯器的安裝及基本使用,感興趣的朋友一起看看吧
    2024-01-01
  • Python實(shí)現(xiàn)監(jiān)控一個(gè)程序的運(yùn)行情況

    Python實(shí)現(xiàn)監(jiān)控一個(gè)程序的運(yùn)行情況

    這篇文章主要為大家介紹了Python如何實(shí)現(xiàn)監(jiān)控一個(gè)程序的運(yùn)行情況,然后視情況將進(jìn)程殺死并重啟,文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下
    2023-05-05
  • 基于Python3讀寫INI配置文件過(guò)程解析

    基于Python3讀寫INI配置文件過(guò)程解析

    這篇文章主要介紹了基于Python3讀寫INI配置文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python可視化Matplotlib散點(diǎn)圖scatter()用法詳解

    Python可視化Matplotlib散點(diǎn)圖scatter()用法詳解

    這篇文章主要介紹了Python可視化中Matplotlib散點(diǎn)圖scatter()的用法詳解,文中附含詳細(xì)示例代碼,有需要得朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • 利用Django-environ如何區(qū)分不同環(huán)境

    利用Django-environ如何區(qū)分不同環(huán)境

    這篇文章主要給大家介紹了關(guān)于利用Django-environ如何區(qū)分不同環(huán)境的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 用python做一個(gè)搜索引擎(Pylucene)的實(shí)例代碼

    用python做一個(gè)搜索引擎(Pylucene)的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇用python做一個(gè)搜索引擎(Pylucene)的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Django1.9 加載通過(guò)ImageField上傳的圖片方法

    Django1.9 加載通過(guò)ImageField上傳的圖片方法

    今天小編就為大家分享一篇Django1.9 加載通過(guò)ImageField上傳的圖片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用

    python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用

    我們?cè)谡碣Y料的時(shí)候,有的時(shí)候過(guò)于混亂難以整理,這時(shí)我們不妨可以對(duì)它先進(jìn)行一個(gè)排序,這樣可以方便我們?yōu)g覽,查詢,有利于我們整理資料,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用,需要的朋友可以參考下
    2022-12-12
  • Python中的if、else、elif語(yǔ)句用法簡(jiǎn)明講解

    Python中的if、else、elif語(yǔ)句用法簡(jiǎn)明講解

    這篇文章主要介紹了Python中的if、else、elif語(yǔ)句的用法講解,條件判斷語(yǔ)句是程序中流程控制的基礎(chǔ)辦法之一,需要的朋友可以參考下
    2016-03-03
  • 基于python實(shí)現(xiàn)操作git過(guò)程代碼解析

    基于python實(shí)現(xiàn)操作git過(guò)程代碼解析

    這篇文章主要介紹了基于python實(shí)現(xiàn)操作git過(guò)程代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

保定市| 彭泽县| 昌邑市| 岗巴县| 古蔺县| 萍乡市| 石景山区| 南充市| 特克斯县| 阜南县| 石首市| 榕江县| 德化县| 湘西| 株洲县| 宜黄县| 毕节市| 遂平县| 维西| 阿克陶县| 中牟县| 铜鼓县| 米脂县| 孟州市| 保定市| 建昌县| 连江县| 汤阴县| 辽宁省| 金寨县| 德兴市| 辽阳市| 山阴县| 长泰县| 桓仁| 江安县| 铁岭市| 永寿县| 四川省| 斗六市| 寿阳县|