6、dict和Set類型

1、Python之什么是dict

Python的 dict 就是專門干這件事的。用dict?表示“名字”-“成績”的查找表如下:

d = {

? ? 'Adam': 95,

? ? 'Lisa': 85,

? ? 'Bart': 59

}

我們把名字稱為key,對應(yīng)的成績稱為value,dict就是通過?key?來查找?value。

花括號?{}?表示這是一個dict,然后按照?key: value, 寫出來即可。最后一個 key: value 的逗號可以省略。

由于dict也是集合,len()?函數(shù)可以計算任意集合的大?。?/p>

>>> len(d)

3

注意:?一個 key-value 算一個,因此,dict大小為3。

2、Python之訪問dict

我們已經(jīng)能創(chuàng)建一個dict,用于表示名字和成績的對應(yīng)關(guān)系:

d = {

? ? 'Adam': 95,

? ? 'Lisa': 85,

? ? 'Bart': 59

}

>>> print d['Adam']

95

使用dict本身提供的一個 get 方法,在Key不存在的時候,返回None:

>>> print d.get('Bart')

59

>>> print d.get('Paul')

None

3、Python中dict的特點

dict的第一個特點是查找速度快,無論dict有10個元素還是10萬個元素,查找速度都一樣。而list的查找速度隨著元素增加而逐漸下降。

不過dict的查找速度快不是沒有代價的,dict的缺點是占用內(nèi)存大,還會浪費很多內(nèi)容,list正好相反,占用內(nèi)存小,但是查找速度慢。

由于dict是按 key 查找,所以,在一個dict中,key不能重復(fù)。

dict的第二個特點就是存儲的key-value序?qū)κ菦]有順序的!這和list不一樣:

d = {

? ? 'Adam': 95,

? ? 'Lisa': 85,

? ? 'Bart': 59

}

當(dāng)我們試圖打印這個dict時:

>>> print d

{'Lisa': 85, 'Adam': 95, 'Bart': 59}

打印的順序不一定是我們創(chuàng)建時的順序,而且,不同的機(jī)器打印的順序都可能不同,這說明dict內(nèi)部是無序的,不能用dict存儲有序的集合。

dict的第三個特點是作為 key 的元素必須不可變,Python的基本類型如字符串、整數(shù)、浮點數(shù)都是不可變的,都可以作為 key。但是list是可變的,就不能作為 key。

可以試試用list作為key時會報什么樣的錯誤。

不可變這個限制僅作用于key,value是否可變無所謂:

最常用的key還是字符串,因為用起來最方便。

4、Python更新dict

d = {

? ? 'Adam': 95,

? ? 'Lisa': 85,

? ? 'Bart': 59

}

新同學(xué)'Paul'的成績 72 加進(jìn)去,用賦值語句:

>>> d['Paul'] = 72

再看看dict的內(nèi)容:

>>> print d

{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 59}

如果 key 已經(jīng)存在,則賦值會用新的 value 替換掉原來的 value:

5、Python之 遍歷dict

d= {

? ? 'Adam': 95,

? ? 'Lisa': 85,

? ? 'Bart': 59

}

for key in d:

? ? print key + ':', d[key]

7、Python中什么是set

dict的作用是建立一組 key 和一組 value 的映射關(guān)系,dict的key是不能重復(fù)的。

有的時候,我們只想要 dict 的 key,不關(guān)心 key 對應(yīng)的 value,目的就是保證這個集合的元素不會重復(fù),這時,set就派上用場了。

set 持有一系列元素,這一點和 list 很像,但是set的元素沒有重復(fù),而且是無序的,這點和 dict 的 key很像。

創(chuàng)建 set 的方式是調(diào)用 set() 并傳入一個 list,list的元素將作為set的元素:

>>> s = set(['A', 'B', 'C'])

可以查看 set 的內(nèi)容:

>>> print s

set(['A', 'C', 'B'])

請注意,上述打印的形式類似 list, 但它不是 list,仔細(xì)看還可以發(fā)現(xiàn),打印的順序和原始 list 的順序有可能是不同的,因為set內(nèi)部存儲的元素是無序的。

因為set不能包含重復(fù)的元素,所以,當(dāng)我們傳入包含重復(fù)元素的 list 會怎么樣呢?

>>> s = set(['A', 'B', 'C', 'C'])

>>> print s

set(['A', 'C', 'B'])

>>> len(s)

3

結(jié)果顯示,set會自動去掉重復(fù)的元素,原來的list有4個元素,但set只有3個元素。

7、Python之 訪問set

由于set存儲的是無序集合,所以我們沒法通過索引來訪問。

訪問 set中的某個元素實際上就是判斷一個元素是否在set中。

例如,存儲了班里同學(xué)名字的set:

>>> s = set(['Adam', 'Lisa', 'Bart', 'Paul'])

我們可以用 in 操作符判斷:

Bart是該班的同學(xué)嗎?

>>> 'Bart' in s

True

>>> 'bart' in s

False

區(qū)分大小寫

8、Python之 set的特點

set的內(nèi)部結(jié)構(gòu)和dict很像,唯一區(qū)別是不存儲value,因此,判斷一個元素是否在set中速度很快。

set存儲的元素和dict的key類似,必須是不變對象,因此,任何可變對象是不能放入set中的。

最后,set存儲的元素也是沒有順序的

weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])

x = '???'# 用戶輸入的字符串

if x in weekdays:

????print 'input ok'

else:

????print?

????'input error'

9、Python之 遍歷set

直接使用 for 循環(huán)可以遍歷 set 的元素:

>>> s = set(['Adam', 'Lisa', 'Bart'])

>>>for name in s:

? ? print name

? ? Lisa

????Adam

????Bart

10、Python之更新set

由于set存儲的是一組不重復(fù)的無序元素,因此,更新set主要做兩件事:

一是把新的元素添加到set中,二是把已有元素從set中刪除。

添加元素時,用set的add()方法:

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

>>> s.add(4)

>>> print s

set([1, 2, 3, 4])

如果添加的元素已經(jīng)存在于set中,add()不會報錯,但是不會加進(jìn)去了:

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

>>> s.add(3)

>>> print s

set([1, 2, 3])

刪除set中的元素時,用set的remove()方法:

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

>>> s.remove(4)

>>> print s

set([1, 2, 3])

如果刪除的元素不存在set中,remove()會報錯:

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

>>> s.remove(4)

Traceback (most recent call last):

? File "<stdin>", line 1, in <module>

KeyError: 4

所以用add()可以直接添加,而remove()前需要判斷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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