1. 程式人生 > >Python 學習筆記 之 day4 sict和set

Python 學習筆記 之 day4 sict和set

變慢 現象 重復 不存在 取出 .get 操作 新的 運行

dict -- dictionary
一組key的集合,包含key與value的對應。
Python內置的字典,在其他語言中成為map,使用key-value存儲,具有幾塊的查找速度。 和list比較,dict的特點:
dict的查找和插入速度極快,不會隨著key的增加而變慢。
dict需要占用大量的內存,內存浪費多。
list的查找和插入時間隨著元素的增加而增加。
list占用空間小,浪費內存很少。
dict是一種用內存空間換取運行時間的一種方法
dict可以用在需要高速查找的地方,幾乎無處不在。 dict的key必須是不可變對象,因為dict根據key來計算value的存儲位置,如果key變化了,那麽value存儲位置就不同,dict內部就混亂了。通過key計算位置的算法成為Hash。
要保證Hash的正確性,作為key的對象就不能變化。字符串、整數等都是不可變對象,而list是可變的,所以list不能作為key。 簡單介紹一下dict:
成績對照表
可以使用兩個list來完成,如:
names = [‘Alias‘,‘Billy‘,‘David‘]
scores = [90,60,75]
給定名字後,根據名字在list的位置,再去另一個list中的對應位置取出元素,得到成績。 list越長,耗時越多。

使用dict來實現,如:
result = { ‘Alias‘:97,‘Billy‘:60,‘David‘,75 }
result[ ‘Alias‘ ]
這種方式,key和value是一一對應的,存放數據時,必須根據key算出value的存放位置,這樣在取值時才會根據key直接拿到value. 一個key只能對應一個值,如果一個dict中有兩個key相同時(一個key出現兩次), 後出現的key的值會覆蓋之前出現的相同key的值.

##dict中存放key的順序與錄入順序無關。

將數據存入dict
1.初始化放入
result = { ‘a‘:20 , ‘b‘:30, ‘c‘:40 }
2.通過key放入
result[‘abc‘] = 12

##如果key不存在,在調用時會報錯。 1.通過 in 來判斷key是否存在。
‘abcd‘ in result
2.通過get()來獲取key對應的值,如果key不存在, 則返回None
可如果key不存在,返回None, 或者為不存在的情況指定返回的value。
如:
co = { ‘Alias‘:1 , ‘Billy‘:2 , ‘Cyndi‘:3 }
co.get(‘David‘)
co.get( ‘David‘ , 4 ) 從dict中刪除
pop()
co.pop(‘Alias‘)
如果不指定pop()中的key ,會報錯。 這一點與list不同,list會刪除掉最後一個元素。

set
和dict類似,也是一組key的集合,但是不存儲value。由於key不能重復,set中沒有重復的key。 創建一個set
創建set需要提供一個list作為輸入集合。
s = set( [1,2,3,4] )

li = [1,2,3,4]
s = set( li )

set內的list中的元素順序不表示set是有序的。
重復元素會被自動過濾。 添加元素到set中
add()
s.add(‘a‘)

list不能作為元素添加到set,會報錯。因為list是可變對象。set與dict都不支持將可變對象作為key。

刪除set中的元素
remove()
s.remove(4)

一次只能remove一個元素。

set可以看做是一個數學意義上的集合,因此多個set之間可以做數學意義上的交集並集操作。
>>> s1 = set( [1,2,4,8,10,28] )
>>> s2 = set( [2,4,6,8,10,12] )
>>> s1 & s2
{8, 2, 10, 4} #交集
>>> s1 | s2
{1, 2, 4, 6, 8, 10, 12, 28} #並集 不可變對象
在此先引入一個新函數 replace()
a=‘abc‘
a.replace(‘a‘,‘A‘)

之前例子裏講,str、int等類型數據都是不可變對象,那麽,如果對這些不可變對象進行replace操作,這些對象是不是已經不再“不可變”了呢? >>> a = ‘abc‘
>>> a.replace(‘a‘,‘BBBBBB‘)
‘BBBBBBbc‘
實際上, replace之後,再進行print(a) ,會發現 對象(變量)a的值依然是 abc,也就是說,對象a實際上也是一個變量,只不過對象a指向的內容才是str ‘abc‘ , replace之後實際上是新建了一個新的變量,可以通過下面的邏輯來解釋這個現象: >>> a =‘abc‘
>>> print(a)
abc
>>> b = a.replace(‘a‘,‘HHHHH‘)
>>> print(b)
HHHHHbc
>>> print(a)
abc
所以,對於不可變對象來說,調用對象的任意方法都不會改變對該對象自身的內容,僅僅會創建新的對象並返回,這樣就保證了不可變對象本身是永遠不可變的。

Python 學習筆記 之 day4 sict和set