python的dict 和set

一、dict
dict是python內(nèi)置的字典,使用key-val存儲(chǔ),在其他語(yǔ)言中 也叫map,具有極快的查找速度,不會(huì)隨著數(shù)據(jù)量的變大而變慢(list就會(huì)隨著長(zhǎng)度變長(zhǎng),耗時(shí)變長(zhǎng))
先看看dict的使用
1、用法
>>> d = {'李雙雙':'女','張cc':'男'}
>>> d
>>> {'張cc': '男', '李雙雙': '女'}
2、看了dict,那為什么dict的速度會(huì)那么快呢?

1)dict的底層實(shí)現(xiàn)
dict的底層實(shí)現(xiàn)是哈希表(hash tables),通過(guò)關(guān)鍵值對(duì)(key-val) 而直接進(jìn)行訪問(wèn)數(shù)據(jù)。它通過(guò)把 key 和value 映射到表中的一個(gè)位置來(lái)進(jìn)行訪問(wèn),這種結(jié)構(gòu)查詢快,更新也非???。在對(duì)key進(jìn)行 hash的時(shí)候,如果遇到相同的hash值,也就是哈希沖突,如何解決呢?一般的做法有兩種,一種是鏈接法,一種是開發(fā)尋址法。python選擇后者。
開放尋址法:所有的元素都存放在散列表里,當(dāng)產(chǎn)生哈希沖突時(shí),通過(guò)一個(gè)探測(cè)函數(shù)計(jì)算出下一個(gè)候選位置,如果下一個(gè)獲選位置還是有沖突,那么不斷通過(guò)探測(cè)函數(shù)往下找,直到找個(gè)一個(gè)空槽來(lái)存放待插入元素
2)list的底層實(shí)現(xiàn)
假設(shè)字典包含了1萬(wàn)個(gè)漢字,
我們要查某一個(gè)字,一個(gè)辦法是把字典從第一頁(yè)往后翻,直到找到我
們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查
找越慢。

第二種方法是先在字典的索引表里(比如部首表)查這個(gè)字對(duì)應(yīng)的頁(yè)
碼,然后直接翻到該頁(yè),找到這個(gè)字。無(wú)論找哪個(gè)字,這種查找速度
都非常快,不會(huì)隨著字典大小的增加而變慢。
dict就是第二種實(shí)現(xiàn)方式
3、訪問(wèn)元素
>>> d['李雙雙']
>>> 女
4、增加元素
>>> d['王某某'] = '女'
>>> d
>>> {'張cc': '男', '李雙雙': '女', '王某某': '女'}
5、修改元素
>> d['李雙雙'] = '男'
>>> d
>>> {'張cc': '男', '李雙雙': '男', '王某某': '女'}
6、 判斷dict的key是否存在

1)一是通過(guò)in判斷key是否存在
>>> if('李雙雙' in d):
>>> print('存在')
>>> 存在

  1. 通過(guò)dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value

    print(d.get('李雙雙2'))
    None

    if(not d.get('李雙雙2')):
    print('不存在')
    不存在

    if(not d.get('李雙雙2',False)):
    print('不存在')
    不存在
    7、元素的刪除 使用pop(key)

    d
    {'張cc': '男', '李雙雙': '男', '王某某': '女'}
    d.pop('王某某')
    '女'
    d
    {'張cc': '男', '李雙雙': '男'}

8、和list比較的優(yōu)缺點(diǎn)
dict
a.查找和插入的速度比較快,不會(huì)隨著key的增加而變慢
b.空間使用較多,需要占用較多的內(nèi)存
list
a.查找和插入的速度會(huì)隨著key的增加而變慢
b.空間使用少,浪費(fèi)內(nèi)存少

二.set
set 就類似于一組key的無(wú)序,不重復(fù)的集合
1、定義
使用set 要提供一個(gè)list作為輸入集合,重復(fù)的值會(huì)被過(guò)濾掉

 >>> s = set([1,2,3,3])
 >>> s
 >>> {1, 2, 3}

2、元素的添加

 >>> s.add(4)
 >>> s
 >>> {1, 2, 3, 4}

3、元素的刪除

 >>> s.remove(4)
 >>> s
 >>> {1, 2, 3}

4、set的交集
 
>>> s
>>> {1, 2, 3}
>>> n = set([2,3,4])
>>> s&n
>>> {2, 3}

5、set的并集

>>> s | n
>>> {1, 2, 3, 4}

set的原理和dict一樣,所以,同樣不可以放入可變對(duì)象,因?yàn)闊o(wú)法判斷兩個(gè)可變對(duì)象是否相等,也就無(wú)法保證set內(nèi)部“不會(huì)有重復(fù)元素”
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容