摘要:這種數(shù)據(jù)結(jié)構(gòu)包含以下幾種常見的操作向關(guān)聯(lián)數(shù)組添加鍵值對(duì)從關(guān)聯(lián)數(shù)組內(nèi)刪除鍵值對(duì)修改關(guān)聯(lián)數(shù)組內(nèi)的鍵值對(duì)根據(jù)已知的鍵尋找值字典問題是設(shè)計(jì)一種能夠具備關(guān)聯(lián)數(shù)組特性的數(shù)據(jù)結(jié)構(gòu)。
定義
Python中有一個(gè)叫作dictionary的對(duì)象類型,翻譯過來就是“字典”,用dict表示。
創(chuàng)建字典 創(chuàng)建空的字典>>> mydict = {} >>> mydict {} >>> type(mydict)>>> person={"name":"liu","sex":"male","age":10} >>> person {"age": 10, "name": "liu", "sex": "male"}
字典dict是以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù)。比如"name":"liu"前面的name叫作鍵(key),后面的liu是前面的鍵所對(duì)應(yīng)的值(value)。在一個(gè)字典中,鍵是唯一的,不能重復(fù)。值則對(duì)應(yīng)于鍵,值可以重復(fù)。
鍵值之間用冒號(hào)隔開,每一對(duì)鍵值之間用逗號(hào)隔開。
添加字典>>> person {"age": 10, "name": "liu", "sex": "male"} >>> person["hobby"]="reading" #增加鍵值對(duì)的方法 >>> person {"hobby": "reading", "age": 10, "name": "liu", "sex": "male"}修改字典
>>> person["age"]=20 >>> person {"hobby": "reading", "age": 20, "name": "liu", "sex": "male"} >>> id(person) 49368784 >>> person["age"]=30 >>> person {"hobby": "reading", "age": 30, "name": "liu", "sex": "male"} >>> id(person) 49368784
結(jié)果可以看出,字典可以原地地修改,即它是可變的,并且不會(huì)創(chuàng)建新的對(duì)象。
利用元組創(chuàng)建字典>>> name = (["first","Google"],["second","Yahoo"]) >>> website=dict(name) >>> website {"second": "Yahoo", "first": "Google"} >>> type(website)使用fromkeys創(chuàng)建字典或者這樣: >>> ad = dict(name="liu",age= 26) >>> ad {"age": 26, "name": "liu"} >>> type(ad)
>>> website={}.fromkeys(("third","forth"),("facebook","amazon")) >>> website {"forth": ("facebook", "amazon"), "third": ("facebook", "amazon")} >>> website={}.fromkeys(("third","forth"),"facebook") >>> website {"forth": "facebook", "third": "facebook"}
特別注意的是,字典中的鍵必須是不可變對(duì)象,值可以是任意類的對(duì)象。
>>> dd = {(1,2):1} >>> dd {(1, 2): 1} >>> type(dd)訪問字典的值>>> dd={[1,2]:1} Traceback (most recent call last): File " ", line 1, in dd={[1,2]:1} TypeError: unhashable type: "list"
字典類型的對(duì)象是以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù)的,所以只要知道鍵就能得到值,這在本質(zhì)上就是一種映射關(guān)系。
>>> person {"hobby": "reading", "age": 30, "name": "liu", "sex": "male"} >>> person["age"] 30 >>> person["hobby"] "reading"基本操作 len(d)
返回字典d中鍵值對(duì)的數(shù)量
>>> city_code = {"beijing":"010","shanghai":"021","guangzhou":"020"} >>> len(city_code) 3d[key]
返回字典d中的鍵key的值
>>> city_code {"beijing": "010", "shanghai": "021", "guangzhou": "020"} >>> city_code["beijing"] "010"d[key] = value
將值賦給字典d中的鍵key
>>> city_code {"beijing": "010", "shanghai": "021", "guangzhou": "020"} >>> city_code["beijing"]="01110" >>> city_code {"beijing": "01110", "shanghai": "021", "guangzhou": "020"}del d[key]
刪除字典d中的鍵key值對(duì)
>>> city_code {"beijing": "01110", "shanghai": "021", "guangzhou": "020"} >>> del city_code["beijing"] >>> city_code {"shanghai": "021", "guangzhou": "020"}key in d
檢查字典d中是否含有鍵為key的項(xiàng)
>>> city_code {"shanghai": "021", "guangzhou": "020"} >>> "shanghai" in city_code True >>> "beijing" in city_code False字符串格式化輸出
>>> city_code {"shanghai": "021", "guangzhou": "020"} >>> "Shanghai is a wonderful city,its area code is %(shanghai)s" % city_code "Shanghai is a wonderful city,its area code is 021"相關(guān)概念 關(guān)聯(lián)數(shù)組
在計(jì)算機(jī)科學(xué)中,關(guān)聯(lián)數(shù)組又稱為映射(Map)、字典(Dictionary),是一個(gè)抽象的數(shù)據(jù)結(jié)構(gòu),它包含著類似于鍵值的有序?qū)Α_@種數(shù)據(jù)結(jié)構(gòu)包含以下幾種常見的操作:
向關(guān)聯(lián)數(shù)組添加鍵值對(duì)
從關(guān)聯(lián)數(shù)組內(nèi)刪除鍵值對(duì)
修改關(guān)聯(lián)數(shù)組內(nèi)的鍵值對(duì)
根據(jù)已知的鍵尋找值
字典問題是設(shè)計(jì)一種能夠具備關(guān)聯(lián)數(shù)組特性的數(shù)據(jù)結(jié)構(gòu)。解決字典問題的常用方法是散列表,但有些情況也可以直接使用有地址的數(shù)組、二叉樹,或者其他結(jié)構(gòu)。
散列表散列表(hash table,也叫哈希表),是根據(jù)關(guān)鍵字而直接訪問在內(nèi)存存儲(chǔ)位置的數(shù)據(jù)結(jié)構(gòu)。即把鍵值通過一個(gè)函數(shù)的計(jì)算,映射到表中的一個(gè)位置來訪問記錄,加快了查找速度。這個(gè)映射函數(shù)稱為散列函數(shù),存放記錄的數(shù)組稱為散列表。
字典的函數(shù) 拷貝淺拷貝:Python在所執(zhí)行的復(fù)制動(dòng)作中,如果是基本類型的數(shù)據(jù),就在內(nèi)存中新建一個(gè)地址存儲(chǔ),如果不是基本類型,就不會(huì)新建一個(gè)地址,而是用標(biāo)簽引用原來的對(duì)象。copy()實(shí)現(xiàn)的是淺拷貝
深拷貝:無論是基本數(shù)據(jù)類型還是其他類型都會(huì)新建一個(gè)地址來存儲(chǔ)。deepcopy()實(shí)現(xiàn)的是深拷貝
copy()>>> ad={"name":"liu","age":20} >>> id(ad) 49368640 >>> cd= ad.copy() >>> cd {"age": 20, "name": "liu"} >>> id(cd) #與ad是不同的對(duì)象 49225776 >>> cd["age"]=40 #修改cd沒有對(duì)ad造成影響 >>> cd {"age": 40, "name": "liu"} >>> ad {"age": 20, "name": "liu"} >>> x={"name":"liu","lang":["python","java","c"]} >>> y = x.copy() >>> y {"lang": ["python", "java", "c"], "name": "liu"} >>> id(x) 49226496 >>> id(y) 49228800 ##y是從x拷貝過來的,兩個(gè)在內(nèi)存中是不同的對(duì)象 >>> y["lang"].remove("c") >>> y {"lang": ["python", "java"], "name": "liu"} >>> x {"lang": ["python", "java"], "name": "liu"} >>> id(x) 49226496 >>> id(y) 49228800 y中刪除元素“c“后,x的鍵lang的值也發(fā)生了變化 >>> id(x["lang"]) 49607424 >>> id(y["lang"]) 49607424 x與y中的列表是同一個(gè)對(duì)象,但是作為字符串的那個(gè)鍵值對(duì)屬于不同的對(duì)象。deepcopy()
>>> x {"lang": ["python", "java"], "name": "liu"} >>> import copy #導(dǎo)入一個(gè)模塊 >>> z = copy.deepcopy(x) #深拷貝 >>> z {"lang": ["python", "java"], "name": "liu"} >>> id(x["lang"]) 49607424 >>> id(z["lang"]) 49607184 #此時(shí)x和z中的列表不屬于同個(gè)對(duì)象 >>> >>> x["lang"].remove("java") >>> x {"lang": ["python"], "name": "liu"} >>> z {"lang": ["python", "java"], "name": "liu"} #此時(shí),修改一個(gè)列表的值,就不會(huì)影響另外一個(gè)列表的值了。clear
clear的作用是將字典清空,得到的是空字典。del是將字典刪除,內(nèi)存中就沒有它了。
>>> x {"lang": ["python"], "name": "liu"} >>> x.clear() >>> x {} >>> del a >>> del x >>> x #x已刪除 Traceback (most recent call last): File "", line 1, in x NameError: name "x" is not defined >>>
如果要清空一個(gè)字典,還能夠使用x = {}這種方法,但這種方法的本質(zhì)是將變量a的引用轉(zhuǎn)向了{(lán)}這個(gè)對(duì)象,那么原來的對(duì)象呢?原來的對(duì)象稱為了斷了線的風(fēng)箏,這樣的東西稱為在Python中稱為垃圾,而且Python能夠自動(dòng)將這樣的垃圾回收。
get和setdefault得到字典中的某個(gè)值
get>>> z {"lang": ["python", "java"], "name": "liu"} >>> z["lang"].remove("java") >>> z {"lang": ["python"], "name": "liu"} >>> >>> z.get("name") "liu" >>> print z.get("age") #返回None None >>> d["age"] #拋出異常 Traceback (most recent call last): File "", line 1, in d["age"] NameError: name "d" is not defined >>> z.get("age",30) #如果age不存在,則返回默認(rèn)值30 30
dict.get()和dict[key]的區(qū)別在于:如果鍵不在字典中,前者返回None,后者拋出異常
setdefault>>> z {"lang": ["python"], "name": "liu"} >>> z.setdefault("age",30) #如果age不存在,則返回默認(rèn)值30,同時(shí)將這對(duì)鍵值對(duì)添加到字典中 30 >>> z {"lang": ["python"], "age": 30, "name": "liu"} >>> z.setdefault("web") >>> z {"lang": ["python"], "web": None, "age": 30, "name": "liu"}items/iteritems,keys/iterkeys,values/itervalues
>>> dd = {"name":"liu","age":40,"websit":"www.liuguoquan.com"} >>> dd_kv = dd.items() >>> dd_kv [("websit", "www.liuguoquan.com"), ("age", 40), ("name", "liu")] >>> type(dd_kv)pop和popitem>>> list(dd_kv) [("websit", "www.liuguoquan.com"), ("age", 40), ("name", "liu")] >>> dd_iter=dd.iteritems() >>> type(dd_iter) >>> dd_iter >>> list(dd_iter) #必須用list()迭代遍歷 [("websit", "www.liuguoquan.com"), ("age", 40), ("name", "liu")] >>> dd {"websit": "www.liuguoquan.com", "age": 40, "name": "liu"} >>> dd.keys() #列出鍵的列表 ["websit", "age", "name"] >>> dd.values() #列出值的列表 ["www.liuguoquan.com", 40, "liu"]
刪除字典鍵值對(duì)
>>> dd {"websit": "www.liuguoquan.com", "age": 40, "name": "liu"} >>> dd.pop("name") #刪除指定鍵 "liu" >>> dd {"websit": "www.liuguoquan.com", "age": 40} >>> dd.pop() #參數(shù)不能省略 Traceback (most recent call last): File "update", line 1, in dd.pop() TypeError: pop expected at least 1 arguments, got 0 >>> dd {"websit": "www.liuguoquan.com", "age": 40} >>> dd.popitem() #隨機(jī)刪除一個(gè)鍵值對(duì) ("websit", "www.liuguoquan.com") >>> dd {"age": 40} >>> dd.popitem() ("age", 40) >>> dd {}
更新字典
>>> d1={"name":"liu"} >>> d2={"age":20} >>> d1.update(d2) #將字典到d2添加到d1中,更新字典 >>> d1 {"age": 20, "name": "liu"} >>> d2 {"age": 20} >>> d2.update([("name","lee"),("lang","python")]) #更新字典 >>> d2 {"lang": "python", "age": 20, "name": "lee"}has_key
判斷字典中是否存在某個(gè)鍵
>>> d2 {"lang": "python", "age": 20, "name": "lee"} >>> d2.has_key("name") True >>> d2.has_key("web") False
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38209.html
摘要:劉先生工程師已婚小三兒查無此人返回值輸出返回值查無此人用于清空字典。劉先生工程師已婚輸出劉先生工程師已婚劉先生工程師已婚還可以用循環(huán)遍歷這三個(gè)方法來分別獲得鍵值。 字典的表現(xiàn)形式為:{key:value},鍵和值之間用冒號(hào)分隔,每個(gè)鍵值對(duì)兒之間用逗號(hào)分隔,比如{‘name’:’超人’,’age’:500},要注意key的類型必須是不可變的類型,python對(duì)key進(jìn)行哈希函數(shù)運(yùn)算,根據(jù)...
摘要:一項(xiàng)目說明項(xiàng)目簡介本次實(shí)驗(yàn)通過使用實(shí)現(xiàn)一個(gè)弱口令掃描器開始,入門滲透測試技術(shù),實(shí)驗(yàn)涉及協(xié)議原理,庫的使用等知識(shí)點(diǎn)。找到密碼并不會(huì)終止程序,而是會(huì)繼續(xù)掃描其他主機(jī)的弱口令,直到所有的主機(jī)都掃描一遍。 showImg(https://segmentfault.com/img/bVz0PF); 一、項(xiàng)目說明 1.1 項(xiàng)目簡介 本次實(shí)驗(yàn)通過使用 Python 實(shí)現(xiàn)一個(gè) FTP 弱口令掃描器開始...
摘要:基礎(chǔ)之控制結(jié)構(gòu)學(xué)習(xí)目標(biāo)代碼塊與縮進(jìn)條件語句語句語句的嵌套斷言循環(huán)循環(huán)循環(huán)中斷循環(huán)控制語句綜合嵌套列表解析式基礎(chǔ)相關(guān)鏈接學(xué)習(xí)目標(biāo)是簡潔易學(xué)面向?qū)ο蟮木幊陶Z言。 Py...
閱讀 3337·2021-11-22 12:04
閱讀 2721·2019-08-29 13:49
閱讀 493·2019-08-26 13:45
閱讀 2256·2019-08-26 11:56
閱讀 1012·2019-08-26 11:43
閱讀 605·2019-08-26 10:45
閱讀 1279·2019-08-23 16:48
閱讀 2167·2019-08-23 16:07