前面介紹的列表和元組都是有序序列,而字典與集合屬于無(wú)序序列,也就是說(shuō),不能通過(guò)索引來(lái)操作元素。
創(chuàng)新互聯(lián)建站成都網(wǎng)站建設(shè)按需設(shè)計(jì)網(wǎng)站,是成都網(wǎng)站設(shè)計(jì)公司,為酒樓設(shè)計(jì)提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站營(yíng)銷(xiāo)推廣熱線:18982081108
10.1 字典
語(yǔ)法格式:
dictionary= {key1 : value1, key2 : value2, key3 : value3 ,...., key n : value n }
其中,dictionary是字典名稱(chēng),key表示元素的鍵,value表示元素的值,鍵和值必須是成對(duì)的。
如:
dict1 = { 'abc': 123, 98.6: 37 }
dict1
{'abc': 123, 98.6: 37}
可以看出,鍵可以是字符串、數(shù)字或者元組,但必須是唯一的;而值可以是任何數(shù)據(jù)類(lèi)型,也沒(méi)有要求是唯一的。
1、創(chuàng)建字典的方法
方法一:同時(shí)給定鍵和值,即“關(guān)鍵字參數(shù)”形式。
dictionary=dict(key1=value1,key2=value2,.....,key n=value n)
注意:這里的key 必須符合Python標(biāo)識(shí)符的命名規(guī)則。
例:
先使用“{}”創(chuàng)建字典:
dict1={1:'一',2:'二',3:'三',4:'四',5:'五'}
dict1
{1: '一', 2: '二', 3: '三', 4: '四', 5: '五'}
再通過(guò)“關(guān)鍵字參數(shù)”形式創(chuàng)建:
dict1=dict(1='一',2='二',3='三',4='四',5='五')
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
創(chuàng)建不成功,原因在于key 不符合Python標(biāo)識(shí)符的命名規(guī)則。前面已經(jīng)介紹過(guò),標(biāo)識(shí)符不能用數(shù)字表示或者用數(shù)字打頭。
現(xiàn)在對(duì)鍵如下修改:
dict1=dict(n1='一',n2='二',n3='三',n4='四',n5='五') #在數(shù)字前加了一個(gè)字符”n”
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五'}
方法二 :使用已經(jīng)存在的元組和列表通過(guò)映射函數(shù)創(chuàng)建字典。
格式:dictionary=dict(zip(tuplekey,listvalue))
例:
tuplekey=('n1','n2','n3','n4','n5') #鍵的序列采用元組
listvalue=['一','二','三','四','五'] #值的序列采用列表
dict1=dict(zip(tuplekey,listvalue))
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五'}
注意:tuple(listname)函數(shù)可以將列表轉(zhuǎn)換為元組,list(tuplename)函數(shù)可以將元組轉(zhuǎn)換為列表。
2、通過(guò)鍵訪問(wèn)字典
直接獲取鍵的相應(yīng)元素的值
dict1['n2']
'二'
利用get()方法
dict1.get('n2')
'二'
get()方法也可以帶參數(shù),當(dāng)要訪問(wèn)的鍵不存在時(shí)返回一個(gè)字符串。如:
dict1.get('n0','can't find!') #當(dāng)要查找的鍵不存在,返回'can't find!'
"can't find!"
3、遍歷字典
使用字典對(duì)象的items()方法可以獲取字典的“鍵.值對(duì)”列表。
for item in dict1.items():
print(item)
('n1', '一')
('n2', '二')
('n3', '三')
('n4', '四')
('n5', '五')
也可以獲取具體的每個(gè)元素的鍵和值,如:
for key,value in dict1.items():
print(key,'對(duì)應(yīng)的是',value)
n1 對(duì)應(yīng)的是 一
n2 對(duì)應(yīng)的是 二
n3 對(duì)應(yīng)的是 三
n4 對(duì)應(yīng)的是 四
n5 對(duì)應(yīng)的是 五
4、添加、修改和刪除字典元素
使用下面的語(yǔ)句,若指定的鍵存在,就可以修改該元素的值;若指定的鍵不存在,則添加該元素。如:
dict1['n6']='六' # 鍵’n6’不存在,故添加該元素
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五', 'n6': '六'}
dict1['n4']='肆' # 鍵’n4’存在,故修改該元素
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '肆', 'n5': '五', 'n6': '六'}
5、利用推導(dǎo)式建立字典
import random
dict1={i:random.randint(1,100) for i in range(5)}
# 生成元素的鍵為0到5整數(shù),值為1到100之間的隨機(jī)數(shù)
print(dict1)
運(yùn)行結(jié)果:{0: 28, 1: 59, 2: 79, 3: 30, 4: 88}
10.2 集合
集合是數(shù)學(xué)中一個(gè)很重要的概念,集合具有確定性、互異性、無(wú)序性三個(gè)基本屬性。在Python中,集合同樣具有這三個(gè)基本屬性,其中,確定性是指對(duì)象要么是集合的元素,要么不是集合的元素;互異性是指集合中的元素不能重復(fù);無(wú)序性是指集合中的元素不分先后次序,可以隨意更換位置。
1、集合的創(chuàng)建
直接使用“{}”創(chuàng)建
set1={'春','夏','秋','冬'}
set1
{'秋', '春', '冬', '夏'}
set2={3,2,1,4,5}
set2
{1, 2, 3, 4, 5}
利用已有的列表、元組創(chuàng)建集合
list1=['東','南','西','北']
set3=set(list1)
set3
{'南', '東', '北', '西'}
利用已有的集合建立一個(gè)“副本”
set3
{'南', '東', '北', '西'} #set3和set4的值一樣
set4=set3
set4
{'南', '東', '北', '西'}
set4.add('中') #給set4添加元素
set4
{'西', '中', '東', '南', '北'} # 這個(gè)好理解
set3
{'西', '中', '東', '南', '北'} # 意想不到吧?Set3為什么會(huì)發(fā)生變化?
再看看簡(jiǎn)單變量的情況:
a=2
b=a #是不是與前面set4=set3相似
b+=1
b
3
a
2 #但a的值并沒(méi)有發(fā)生改變
從上面集合set3、set4和簡(jiǎn)單變量a、b的值的變化情況對(duì)比,不難發(fā)現(xiàn)set3和set4是指向同一地址的對(duì)象,而變量a和變量b指向了不同地址,語(yǔ)句b=a是將a的值傳遞個(gè)b,并不是將a的地址傳遞給b。列表、元組、字典都和集合一樣具有這樣的性質(zhì)。
所以,將set4稱(chēng)為set3的“副本”更為恰當(dāng)。
2、添加和刪除元素
set3
{'南', '東', '北', '西'}
set3.add('中') # 添加元素
set3
{'西', '中', '東', '南', '北'} # 集合內(nèi)的元素是無(wú)序的,不要糾結(jié)次序的變化
set3.remove('中') # 刪除元素
set3
{'西', '東', '南', '北'}
3、集合運(yùn)算
集合運(yùn)算包括交()、并(|)、差(-),和數(shù)學(xué)中的集合運(yùn)算是一致的。
set3={'南', '東', '北', '西'}
set4={'西', '中', '東', '南', '北'}
set3 set4 #取set3和set4的交集
{'西', '南', '北', '東'}
set3 | set4 #取set3和set4的并集
{'中', '南', '北', '西', '東'}
set3 - set4 #取set3與set4的差,即set3比set4多出來(lái)的元素
set()
set4 -set3 #取set4與set3的差,即set4比set3多出來(lái)的元素
{'中'}
因?yàn)樽值涫峭ㄟ^(guò)鍵來(lái)索引的,關(guān)聯(lián)到相對(duì)的值,理論上他的查詢(xún)復(fù)雜度是O(1)。
哈希表(也叫散列表),根據(jù)關(guān)鍵值對(duì)(Key-value)而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。它通過(guò)把key和value映射到表中一個(gè)位置來(lái)訪問(wèn)記錄,這種查詢(xún)速度非常快,更新也快。而這個(gè)映射函數(shù)叫做哈希函數(shù),存放值的數(shù)組叫做哈希表。 哈希函數(shù)的實(shí)現(xiàn)方式?jīng)Q定了哈希表的搜索效率。
“鍵值對(duì)”是組織數(shù)據(jù)的一種重要方式,廣泛應(yīng)用在Web系統(tǒng)中。鍵值對(duì)的基本思想是將“值”信息關(guān)聯(lián)一個(gè)“鍵”信息,進(jìn)而通過(guò)鍵信息查找對(duì)應(yīng)值信息,這個(gè)過(guò)程叫映射。Python語(yǔ)言中通過(guò)字典類(lèi)型實(shí)現(xiàn)映射。
Python語(yǔ)言中的字典使用大括號(hào){}建立,每個(gè)元素是一個(gè)鍵值對(duì),使用方式如下:
??? {鍵1:值1, 鍵2:值2, ... , 鍵n:值n}
其中,鍵和值通過(guò)冒號(hào)連接,不同鍵值對(duì)通過(guò)逗號(hào)隔開(kāi)。字典類(lèi)型也具有和集合類(lèi)似的性質(zhì),即鍵值對(duì)之間沒(méi)有順序且不能重復(fù)。?
列表類(lèi)型采用元素順序的位置進(jìn)行索引。由于字典元素“鍵值對(duì)”中鍵是值的索引,因此,可以直接利用鍵值對(duì)關(guān)系索引元素。
字典中鍵值對(duì)的索引模式如下,采用中括號(hào)格式:
??? 值 = 字典變量[鍵]
print(d[‘201801’])? ??
輸出的也就是: 小明
使用大括號(hào)可以創(chuàng)建字典。通過(guò)索引和賦值配合,可以向字典中增加元素。
字典是存儲(chǔ)可變數(shù)量鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),鍵和值可以是任意數(shù)據(jù)類(lèi)型,通過(guò)鍵索引值,并可以通過(guò)鍵修改值。
字典類(lèi)型有一些通用的操作函數(shù)
dict()函數(shù)用于生成一個(gè)空字典,作用和{}一致
字典類(lèi)型存在一些操作方法,使用語(yǔ)法形式是:
字典變量.方法名稱(chēng)(方法參數(shù))
d.keys()返回字典中的所有鍵信息,返回結(jié)果是Python的一種內(nèi)部數(shù)據(jù)類(lèi)型dict_keys,專(zhuān)用于表示字典的鍵。如果希望更好的使用返回結(jié)果,可以將其轉(zhuǎn)換為列表類(lèi)型。
d.values()返回字典中的所有值信息,返回結(jié)果是Python的一種內(nèi)部數(shù)據(jù)類(lèi)型dict_values。如果希望更好的使用返回結(jié)果,也可以將其轉(zhuǎn)換為列表類(lèi)型。
d.items()返回字典中的所有鍵值對(duì)信息,返回結(jié)果是Python的一種內(nèi)部數(shù)據(jù)類(lèi)型dict_items。當(dāng)然也可以轉(zhuǎn)成列表類(lèi)型? ?即: list(d.items())
d.get(key, default)根據(jù)鍵信息查找并返回值信息,如果key存在則返回相應(yīng)值,否則返回默認(rèn)值,第二個(gè)元素default可以省略,如果省略則默認(rèn)值為空。? 例如:? 就拿上邊的數(shù)組d? 來(lái)說(shuō) d.get(‘201801’,“不存在”)? ?相當(dāng)于一個(gè)if語(yǔ)句? 如果key? 201801 存在? 就返回201801 values? 不存在就返回? ?默認(rèn)值? 不存在
d.pop(key, default)根據(jù)鍵信息查找并取出值信息,如果key存在則返回相應(yīng)值,否則返回默認(rèn)值,第二個(gè)元素default可以省略,如果省略則默認(rèn)值為空。相比d.get()方法,d.pop()在取出相應(yīng)值后,將從字典中刪除對(duì)應(yīng)的鍵值對(duì)。? 和d.get方法類(lèi)似?
d.popitem()隨機(jī)從字典中取出一個(gè)鍵值對(duì),以元組(key,value)形式返回。取出后從字典中刪除這個(gè)鍵值對(duì)。
d.clear()刪除字典中所有鍵值對(duì)。
此外,如果希望刪除字典中某一個(gè)元素,可以使用Python保留字del。? ?即: del? d[key]
字典類(lèi)型也支持保留字in,用來(lái)判斷一個(gè)鍵是否在字典中。如果在則返回True,否則返回False。
與其他組合類(lèi)型一樣,字典可以遍歷循環(huán)對(duì)其元素進(jìn)行遍歷,基本語(yǔ)法結(jié)構(gòu)如下:
for 變量名 in 字典名
語(yǔ)句塊
for循環(huán)返回的變量名是字典的索引值。如果需要獲得鍵對(duì)應(yīng)的值,可以在語(yǔ)句塊中通過(guò)get()方法獲得。
以上就是本章的所有內(nèi)容,感謝大家.
Python 學(xué)習(xí)的基礎(chǔ)(持續(xù)更新中......)
同于我用過(guò)的其它編程語(yǔ)言,Python 沒(méi)有 switch / case 語(yǔ)句。為了實(shí)現(xiàn)它,我們可以使用字典映射:
這段代碼類(lèi)似于:
Python 代碼通常比處理 case 的標(biāo)準(zhǔn)方法更為簡(jiǎn)短,也可以說(shuō)它更難理解。當(dāng)我初次使用 Python 時(shí),感覺(jué)很奇怪并且心煩意亂。而隨著時(shí)間的推移,在 switch 中使用字典的 key 來(lái)做標(biāo)識(shí)符變得越來(lái)越習(xí)以為常。
函數(shù)的字典映射
在 Python 中字典映射也可以包含函數(shù)或者 lambda 表達(dá)式:
雖然?zero?和?one?中的代碼很簡(jiǎn)單,但是很多 Python 程序使用這樣的字典映射來(lái)調(diào)度復(fù)雜的流程。
類(lèi)的調(diào)度方法
如果在一個(gè)類(lèi)中,不確定要使用哪種方法,可以用一個(gè)調(diào)度方法在運(yùn)行的時(shí)候來(lái)確定。
很靈活,對(duì)吧?
官方說(shuō)明
官方文檔的解釋說(shuō),“用if... elif... elif... else序列很容易來(lái)實(shí)現(xiàn) switch / case 語(yǔ)句”。而且可以使用函數(shù)字典映射和類(lèi)的調(diào)度方法。
具體函數(shù)有 set(),pop(),update(),items(),keys(),values(),get(),setdefault()
python 字典操作
假設(shè)字典為 dics = {0:'a', 1:'b', 'c':3}
二是使用dict本身提供的一個(gè) get 方法,在Key不存在的時(shí)候,返回None:
print dics.get('a')
print dics.get('Paul')
None
dict.get(key,default=None) 兩個(gè)選項(xiàng) 一個(gè) key 一個(gè) default= None ----default可以是任何strings(字符)
2.從字典中取值,若找到則刪除;當(dāng)鍵不存在時(shí),顯示異常key error
[方法]? dics.pop('key')
3.給字典添加一個(gè)條目。如果不存在,就指定特定的值;若存在,就算了。
[方法] dic.setdefault(key, value)
4. update
a = {'a':1,'b':2}
a.update({'c':3})
a
{'a': 1,'c': 3,'b': 2}
a.update({'c':4})
a
{'a': 1,'c': 4,'b': 2}
dict的作用是建立一組 key 和一組 value 的映射關(guān)系,dict的key是不能重復(fù)的。
有的時(shí)候,我們只想要 dict 的 key,不關(guān)心 key 對(duì)應(yīng)的 value,目的就是保證這個(gè)集合的元素不會(huì)重復(fù),這時(shí),set就派上用場(chǎng)了。
python字典的構(gòu)成形式為:字典是Python語(yǔ)言中唯一的映射類(lèi)型。
映射類(lèi)型對(duì)象里哈希值(鍵,key)和悔櫻悶指向的對(duì)象(值,value)是一對(duì)多的關(guān)系,通常被認(rèn)為是可變的哈希表。
字典對(duì)象是可變的,它是一個(gè)容器類(lèi)型,能存儲(chǔ)任意個(gè)數(shù)的Python對(duì)象,其中也可包括其他容器類(lèi)型。
字典類(lèi)型與序列類(lèi)型的區(qū)別:
1、存取和訪問(wèn)數(shù)據(jù)的方式不同。
2、序列類(lèi)型使用數(shù)字類(lèi)型的鍵(從序列的開(kāi)始按數(shù)值順序索引)。
3、映射類(lèi)型可以用其他對(duì)象類(lèi)型作鍵(如:數(shù)字、字符串、元祖,一般用字符串作鍵),和序列類(lèi)型的鍵不同,映射類(lèi)型的鍵直接或間接的和存儲(chǔ)數(shù)據(jù)值相關(guān)聯(lián)。
4、映射類(lèi)型中的數(shù)據(jù)是無(wú)序排列的。這和序列類(lèi)型是不一樣的,序列類(lèi)型是以數(shù)值序排列的。
5、映射類(lèi)型用鍵直接“映射”到值。
字典是Python中最強(qiáng)大的數(shù)據(jù)類(lèi)型之一
使用字典的注意不能允許一鍵對(duì)應(yīng)多個(gè)值;鍵必須是可哈希的。
len()返回字典的長(zhǎng)度。
hash()返回對(duì)象的哈希值,可以用來(lái)判斷一個(gè)對(duì)象能否用來(lái)作為字典的鍵。
dict()工廠函數(shù),用來(lái)創(chuàng)建字典頌跡。