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

Python字典和集合的底層原來是這么玩的

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

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

截圖就是當時控制臺報的 unhashable type: 'list',就是這行破代碼,逼得我把字典、哈希表、可變不可變對象全啃了一遍。

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

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

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

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

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

這就是列表的硬傷:查找、插入的速度會跟著元素變多越來越慢。

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

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

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

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

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

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

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

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

核心大坑:為啥列表絕對不能當字典的 key?

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

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

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

順便記一下字典的優(yōu)缺點,別把它當萬能藥:

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

秒懂 Set:就是個沒有 value 的字典

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

直接上可運行的 demo:

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

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

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

終極迷惑:可變對象 vs 不可變對象

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

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

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

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

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

寫在最后

這次從一個報錯啃完所有知識點,腦子里就刻下了三個核心:

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

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

這次踩坑爬坑的過程還挺有意思的。

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

相關(guān)文章

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

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

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

    Python實現(xiàn)監(jiān)控一個程序的運行情況

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

    基于Python3讀寫INI配置文件過程解析

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

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

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

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

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

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

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

    Django1.9 加載通過ImageField上傳的圖片方法

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

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

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

    Python中的if、else、elif語句用法簡明講解

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

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

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

最新評論

同心县| 隆尧县| 北辰区| 南丹县| 贵德县| 南阳市| 当雄县| 兴义市| 台东县| 金湖县| 宁国市| 北京市| 泽州县| 郁南县| 东阿县| 上虞市| 阿克| 德阳市| 恭城| 五家渠市| 北票市| 米泉市| 遂川县| 固原市| 乐平市| 墨竹工卡县| 壤塘县| 濮阳县| 图木舒克市| 元氏县| 泊头市| 余江县| 精河县| 晋城| 宁波市| 盐亭县| 金川县| 临江市| 澳门| 十堰市| 洛扎县|