一抓督、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ān)鍵值對(duì)(key-val) 而直接進(jìn)行訪問數(shù)據(jù)。它通過把 key 和value 映射到表中的一個(gè)位置來(lái)進(jìn)行訪問睁蕾,這種結(jié)構(gòu)查詢快苞笨,更新也非痴洌快。在對(duì)key進(jìn)行 hash的時(shí)候瀑凝,如果遇到相同的hash值序芦,也就是哈希沖突,如何解決呢粤咪?一般的做法有兩種谚中,一種是鏈接法,一種是開發(fā)尋址法寥枝。python選擇后者宪塔。
開放尋址法:所有的元素都存放在散列表里,當(dāng)產(chǎn)生哈希沖突時(shí)囊拜,通過一個(gè)探測(cè)函數(shù)計(jì)算出下一個(gè)候選位置蝌麸,如果下一個(gè)獲選位置還是有沖突,那么不斷通過探測(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故爵、訪問元素
>>> d['李雙雙']
>>> 女
4玻粪、增加元素
>>> d['王某某'] = '女'
>>> d
>>> {'張cc': '男', '李雙雙': '女', '王某某': '女'}
5、修改元素
>> d['李雙雙'] = '男'
>>> d
>>> {'張cc': '男', '李雙雙': '男', '王某某': '女'}
6诬垂、 判斷dict的key是否存在
1)一是通過in判斷key是否存在
>>> if('李雙雙' in d):
>>> print('存在')
>>> 存在
-
通過dict提供的get方法劲室,如果key不存在,可以返回None结窘,或者自己指定的value
print(d.get('李雙雙2'))
Noneif(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ì)被過濾掉
>>> 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ù)元素”