python系列(四)python元组与字典
博主QQ:819594300
博客地址:http://zpf666.blog.51cto.com/
有什么疑問(wèn)的朋友可以聯(lián)系博主,博主會(huì)幫你們解答,謝謝支持!
本博文目錄:
一、元組 | 二、字典 | 三、字典的使用方法
前言:列表非常適合用于存儲(chǔ)在程序運(yùn)行期間可能變化的數(shù)據(jù)集。列表是可以修改的,這對(duì)處理網(wǎng)站的用戶列表或游戲中的角色列表至關(guān)重要。然而,有時(shí)候你需要?jiǎng)?chuàng)建一些列不可修改的元素,元組就可以滿足你這樣的需求。Python將不能修改的值稱為不可變的,而不可變的列表就被稱為元組。
正文部分:
一、元組
1、元組的概念
元組:(tuple),有序列表叫元組,tuple和list非常類似,不同之處是list列表可以修改元素,而元組是無(wú)法修改定義好的元素的。
元組使用“()”小括號(hào)來(lái)定義。
定義元組后,就可以使用索引來(lái)訪問(wèn)其元組,就像訪問(wèn)列表元素一樣。
元組的類型是“tuple”。
xidamingzhu這個(gè)tuple不能變了,它也沒(méi)有append(),insert()這樣的方法。其他獲取元素的方法和list是一樣的,你可以正常地使用xidamingzhu[0],xidamingzhu[-1],但不能賦值成另外的元素。
那不可變的tuple有什么意義?因?yàn)閠uple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。
如果要定義一個(gè)空的tuple,可以寫(xiě)成():
但是,要定義一個(gè)只有1個(gè)元素的tuple,如果你這么定義:
那么這定義的不是tuple,而是1這個(gè)整數(shù),這是因?yàn)樾±ㄌ?hào)()既可以表示tuple,又可以表示數(shù)學(xué)公式中的小括號(hào)。這就產(chǎn)生了歧義,因此,Python規(guī)定,這種情況下,按小括號(hào)進(jìn)行計(jì)算,計(jì)算結(jié)果自然整數(shù)是1。
那么你想說(shuō),我就是想定只有一個(gè)元素的元組,那怎么辦?
答案是好辦,解決辦法如下:
只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),,來(lái)消除歧義:
Python在顯示只有1個(gè)元素的tuple時(shí),也會(huì)加一個(gè)逗號(hào),,以免你誤解成數(shù)學(xué)計(jì)算意義上的括號(hào)。
2)消除對(duì)tuple的元素不變的誤解
下面通過(guò)一個(gè)例子來(lái)說(shuō)明一個(gè)可愛(ài)的tuple。
看了這個(gè)例子,你可能會(huì)有疑問(wèn),不是說(shuō)元組的元素不可修改嗎?這怎么可修改。
我的答案是,你別急,繼續(xù)看下面的分析。
這個(gè)tuple定義的時(shí)候有3個(gè)元素,分別是'a','b'和一個(gè)list。
我們先看看定義的時(shí)候tuple包含的3個(gè)元素:
當(dāng)我們把list的元素'A'和'B'修改為'X'和'Y'后,tuple變了,表面上看,tuple的元素確實(shí)變了,但其實(shí)變的不是tuple的元素,而是list的元素。tuple一開(kāi)始指向的list并沒(méi)有改成別的list,所以,tuple所謂的“不變”,是說(shuō)tuple的每個(gè)元素,指向永遠(yuǎn)不變。即指向'a',就不能改成指向'b',指向一個(gè)list,就不能改成指向其他對(duì)象,但指向的這個(gè)list本身是可變的!
理解了“指向不變”后,要?jiǎng)?chuàng)建一個(gè)內(nèi)容也不變的tuple怎么做?那就必須保證tuple的每一個(gè)元素本身也不能變。
元組可以使用函數(shù)count()和index():
3)遍歷元組中的所有值
4)如想改變tuple的元素,只能重新賦值整個(gè)元組
二、字典
Python內(nèi)置了字典:dict的支持,dict全稱dictionary,在其他語(yǔ)言中也稱為map,使用鍵-值(key-value)存儲(chǔ),具有極快的查找速度。
1)字典使用{}定義
說(shuō)明:舉個(gè)例子,假設(shè)要根據(jù)同學(xué)的名字查找對(duì)應(yīng)的成績(jī),如果用list實(shí)現(xiàn),需要兩個(gè)list:
用list查找過(guò)程是這樣的:給定一個(gè)名字,要查找對(duì)應(yīng)的成績(jī),就先要在name中找到對(duì)應(yīng)的位置,再?gòu)膕core取出對(duì)應(yīng)的成績(jī),list越長(zhǎng),耗時(shí)越長(zhǎng)。
如果用dict實(shí)現(xiàn),只需要一個(gè)“名字”-“成績(jī)”的對(duì)照表,直接根據(jù)名字查找成績(jī),無(wú)論這個(gè)表有多大,查找速度都不會(huì)變慢。
下面用python編寫(xiě)一個(gè)dict(字典),內(nèi)容如下:
為什么dict查找速度這么快?因?yàn)閐ict的實(shí)現(xiàn)原理和查字典是一樣的。假設(shè)字典包含了1萬(wàn)個(gè)漢字,我們要查某一個(gè)字,一個(gè)辦法是把字典從第一頁(yè)往后翻,直到找到我們想要的字為止,這種方法就相當(dāng)于在list中查找元素的方法,list越大,查找越慢。
第二種方法是先在字典的索引表里(比如部首表)查這個(gè)字對(duì)應(yīng)的頁(yè)碼,然后直接翻到該頁(yè),找到這個(gè)字。無(wú)論找哪個(gè)字,這種查找速度都非常快,不會(huì)隨著字典大小的增加而變慢。
dict就是第二種實(shí)現(xiàn)方式,給定一個(gè)名字,比如“王五”,dict在內(nèi)部就可以直接計(jì)算出王五對(duì)應(yīng)的存放成績(jī)的“頁(yè)碼”,也就是75這個(gè)數(shù)字存放的內(nèi)存地址,直接取出來(lái),所以速度非常快。
這種key-value存儲(chǔ)方式,在放進(jìn)去的時(shí)候,必須根據(jù)key算出value的存放位置,這樣,取的時(shí)候才能根據(jù)key直接拿到value。
把數(shù)據(jù)放入dict的方法,除了初始化時(shí)指定外,還可以通過(guò)key放入:
由于一個(gè)key只能對(duì)應(yīng)一個(gè)value,所以,多次對(duì)一個(gè)key放入value,后面的值會(huì)把前面的值沖掉:
如果key不存在,dict就會(huì)報(bào)錯(cuò):
要避免key不存在的錯(cuò)誤,有兩種辦法。
一是通過(guò)in判斷key是否存在:
二是通過(guò)dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:
注意:返回None的時(shí)候Python的交互式命令行不顯示結(jié)果。
要?jiǎng)h除一個(gè)key,用pop(key)方法,對(duì)應(yīng)的value也會(huì)從dict中刪除:
請(qǐng)務(wù)必注意,dict內(nèi)部存放的順序和key放入的順序是沒(méi)有關(guān)系的。
和list比較,dict有以下幾個(gè)特點(diǎn):
dict特點(diǎn):
①查找和插入的速度極快,不會(huì)隨著key的增加而變慢;
②需要占用大量的內(nèi)存,內(nèi)存浪費(fèi)多,而list相反;
list特點(diǎn):
①查找和插入的時(shí)間隨著元素的增加而增加;
②占用空間小,浪費(fèi)內(nèi)存很少。
所以,dict是用空間來(lái)?yè)Q取時(shí)間的一種方法。
說(shuō)明:dict可以用在需要高速查找的很多地方,在Python代碼中幾乎無(wú)處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對(duì)象。這是因?yàn)閐ict根據(jù)key來(lái)計(jì)算value的存儲(chǔ)位置,如果每次計(jì)算相同的key得出的結(jié)果不同,那dict內(nèi)部就完全混亂了。這個(gè)通過(guò)key計(jì)算位置的算法稱為哈希算法(hash),要保證hash的正確性,作為key的對(duì)象就不能變。在Python中,字符串、整數(shù)等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key。
三、字典的使用方法
1)定義一個(gè)字典
2)刪除字典中所有key和value值
3)將a字典的元素賦值給b
、
這里有個(gè)特別需要注意的點(diǎn)需要說(shuō)明一下:
舉一個(gè)例子來(lái)說(shuō)明一下:
①定義一個(gè)字典a,然后讓b和c通過(guò)兩種方式讓字典a的元素賦值給自己一份。
②增加字典a的元素(即:key-value)
③再來(lái)查看字典b和字典c的元素
會(huì)發(fā)現(xiàn)字典b的元素沒(méi)有隨著字典a的增加而增加,而字典c倒是隨著字典a的增加而增加,這個(gè)情況和我們?cè)诘谝黄猵ython那篇博文中所說(shuō)的數(shù)值、字符串不隨著原有數(shù)值、字符串的改變而改變,這里卻是改變了,這是因?yàn)閜ython規(guī)定,字典c=字典a的時(shí)候,在內(nèi)存里面,字典c直接就是指向字典a,而b=a.copy()的方式,在內(nèi)存里是讓字典b指向a此時(shí)此刻所對(duì)應(yīng)的元素,一旦字典a改變了,b還是指向原有的那些元素,而不發(fā)生改變,而c因?yàn)橹苯泳褪侵赶虻腶,所以a改變,c也跟著改變,這一點(diǎn)和數(shù)值、字符串正好相反,這一點(diǎn)需要特別的注意。
4)只定義key值,()中的內(nèi)容可以來(lái)自于定義好的一個(gè)字典,或者一個(gè)列表,只定義key值,value值為none
5)根據(jù)key,得出value值
注意:上一張圖片說(shuō)明,根據(jù)key得value,如果key不存在,則python不會(huì)有任何報(bào)錯(cuò)信息。
6)判斷key值是否存在
為什么我判斷key值是否存在失敗了呢?這是因?yàn)閜ython3.x版本,刪除了has_key()這個(gè)查詢方法,這個(gè)方法只停留在python2.x系列版本。我們?cè)?.x版本里可以使用如下的查詢方法:
在2.x版本還是用has_key()方法:
7)以列表形式分組輸出key,value值
8)字典中的迭代器
Python3.x版本沒(méi)有iteritems()這個(gè)用法,該用法只停留在python2.x版本,如下所示:
說(shuō)明:d.next():無(wú)序輸出字典中的元素。
9)迭代器,只輸出key值
同樣,Python3.x版本也沒(méi)有iterkeys()這個(gè)用法,該用法只停留在python2.x版本,如下所示:
10)只輸出key值
11)刪除key和value,根據(jù)key來(lái)刪除
12)隨機(jī)刪除key和value
i.popitem(),小括號(hào)內(nèi)不能有任何東西。
13)根據(jù)key值返回value值,如果key不存在,則默認(rèn)添加key,value則為None
如果key存在,則返回其對(duì)應(yīng)的vlaue值:
其實(shí),setdefault()也可以用來(lái)新增字典中的元素,用法如下:
14)b是一個(gè)字典,將b字典添加到i字典中
有一種情況,就是要添加的字典中的key值與當(dāng)前字典key一樣,會(huì)覆蓋原value值:
15)輸出i字典中的所有value值
16)分組列表形式顯示key和value值
Python3.x版本沒(méi)有viewitems()的用法,只停留在python2.x版本:
17)列表形式顯示所有的key
同樣,Python3.x版本沒(méi)有viewkeys()的用法,只停留在python2.x版本:
總結(jié)
以上是生活随笔為你收集整理的python系列(四)python元组与字典的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DBA生存警示:防范频发的数据误删除操作
- 下一篇: ASP.NET Aries 入门开发教程