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