摘要:這種數(shù)據(jù)結(jié)構(gòu)包含以下幾種常見的操作向關(guān)聯(lián)數(shù)組添加鍵值對從關(guān)聯(lián)數(shù)組內(nèi)刪除鍵值對修改關(guān)聯(lián)數(shù)組內(nèi)的鍵值對根據(jù)已知的鍵尋找值字典問題是設(shè)計(jì)一種能夠具備關(guān)聯(lián)數(shù)組特性的數(shù)據(jù)結(jié)構(gòu)。
定義
Python中有一個叫作dictionary的對象類型,翻譯過來就是“字典”,用dict表示。
創(chuàng)建字典 創(chuàng)建空的字典>>> mydict = {} >>> mydict {} >>> type(mydict)>>> person={"name":"liu","sex":"male","age":10} >>> person {"age": 10, "name": "liu", "sex": "male"}
字典dict是以鍵值對的形式存儲數(shù)據(jù)。比如"name":"liu"前面的name叫作鍵(key),后面的liu是前面的鍵所對應(yīng)的值(value)。在一個字典中,鍵是唯一的,不能重復(fù)。值則對應(yīng)于鍵,值可以重復(fù)。
鍵值之間用冒號隔開,每一對鍵值之間用逗號隔開。
添加字典>>> person {"age": 10, "name": "liu", "sex": "male"} >>> person["hobby"]="reading" #增加鍵值對的方法 >>> 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é)果可以看出,字典可以原地地修改,即它是可變的,并且不會創(chuàng)建新的對象。
利用元組創(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"}
特別注意的是,字典中的鍵必須是不可變對象,值可以是任意類的對象。
>>> 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"
字典類型的對象是以鍵值對的形式存儲數(shù)據(jù)的,所以只要知道鍵就能得到值,這在本質(zhì)上就是一種映射關(guān)系。
>>> person {"hobby": "reading", "age": 30, "name": "liu", "sex": "male"} >>> person["age"] 30 >>> person["hobby"] "reading"基本操作 len(d)
返回字典d中鍵值對的數(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值對
>>> 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),是一個抽象的數(shù)據(jù)結(jié)構(gòu),它包含著類似于鍵值的有序?qū)?。這種數(shù)據(jù)結(jié)構(gòu)包含以下幾種常見的操作:
向關(guān)聯(lián)數(shù)組添加鍵值對
從關(guān)聯(lián)數(shù)組內(nèi)刪除鍵值對
修改關(guān)聯(lián)數(shù)組內(nèi)的鍵值對
根據(jù)已知的鍵尋找值
字典問題是設(shè)計(jì)一種能夠具備關(guān)聯(lián)數(shù)組特性的數(shù)據(jù)結(jié)構(gòu)。解決字典問題的常用方法是散列表,但有些情況也可以直接使用有地址的數(shù)組、二叉樹,或者其他結(jié)構(gòu)。
散列表散列表(hash table,也叫哈希表),是根據(jù)關(guān)鍵字而直接訪問在內(nèi)存存儲位置的數(shù)據(jù)結(jié)構(gòu)。即把鍵值通過一個函數(shù)的計(jì)算,映射到表中的一個位置來訪問記錄,加快了查找速度。這個映射函數(shù)稱為散列函數(shù),存放記錄的數(shù)組稱為散列表。
字典的函數(shù) 拷貝淺拷貝:Python在所執(zhí)行的復(fù)制動作中,如果是基本類型的數(shù)據(jù),就在內(nèi)存中新建一個地址存儲,如果不是基本類型,就不會新建一個地址,而是用標(biāo)簽引用原來的對象。copy()實(shí)現(xiàn)的是淺拷貝
深拷貝:無論是基本數(shù)據(jù)類型還是其他類型都會新建一個地址來存儲。deepcopy()實(shí)現(xiàn)的是深拷貝
copy()>>> ad={"name":"liu","age":20} >>> id(ad) 49368640 >>> cd= ad.copy() >>> cd {"age": 20, "name": "liu"} >>> id(cd) #與ad是不同的對象 49225776 >>> cd["age"]=40 #修改cd沒有對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拷貝過來的,兩個在內(nèi)存中是不同的對象 >>> 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中的列表是同一個對象,但是作為字符串的那個鍵值對屬于不同的對象。deepcopy()
>>> x {"lang": ["python", "java"], "name": "liu"} >>> import copy #導(dǎo)入一個模塊 >>> z = copy.deepcopy(x) #深拷貝 >>> z {"lang": ["python", "java"], "name": "liu"} >>> id(x["lang"]) 49607424 >>> id(z["lang"]) 49607184 #此時x和z中的列表不屬于同個對象 >>> >>> x["lang"].remove("java") >>> x {"lang": ["python"], "name": "liu"} >>> z {"lang": ["python", "java"], "name": "liu"} #此時,修改一個列表的值,就不會影響另外一個列表的值了。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 >>>
如果要清空一個字典,還能夠使用x = {}這種方法,但這種方法的本質(zhì)是將變量a的引用轉(zhuǎn)向了{(lán)}這個對象,那么原來的對象呢?原來的對象稱為了斷了線的風(fēng)箏,這樣的東西稱為在Python中稱為垃圾,而且Python能夠自動將這樣的垃圾回收。
get和setdefault得到字典中的某個值
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,同時將這對鍵值對添加到字典中 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"]
刪除字典鍵值對
>>> 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ī)刪除一個鍵值對 ("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
判斷字典中是否存在某個鍵
>>> d2 {"lang": "python", "age": 20, "name": "lee"} >>> d2.has_key("name") True >>> d2.has_key("web") False
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/38209.html
摘要:劉先生工程師已婚小三兒查無此人返回值輸出返回值查無此人用于清空字典。劉先生工程師已婚輸出劉先生工程師已婚劉先生工程師已婚還可以用循環(huán)遍歷這三個方法來分別獲得鍵值。 字典的表現(xiàn)形式為:{key:value},鍵和值之間用冒號分隔,每個鍵值對兒之間用逗號分隔,比如{‘name’:’超人’,’age’:500},要注意key的類型必須是不可變的類型,python對key進(jìn)行哈希函數(shù)運(yùn)算,根據(jù)...
摘要:一項(xiàng)目說明項(xiàng)目簡介本次實(shí)驗(yàn)通過使用實(shí)現(xiàn)一個弱口令掃描器開始,入門滲透測試技術(shù),實(shí)驗(yàn)涉及協(xié)議原理,庫的使用等知識點(diǎn)。找到密碼并不會終止程序,而是會繼續(xù)掃描其他主機(jī)的弱口令,直到所有的主機(jī)都掃描一遍。 showImg(https://segmentfault.com/img/bVz0PF); 一、項(xiàng)目說明 1.1 項(xiàng)目簡介 本次實(shí)驗(yàn)通過使用 Python 實(shí)現(xiàn)一個 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...
閱讀 3381·2021-11-22 12:04
閱讀 2770·2019-08-29 13:49
閱讀 534·2019-08-26 13:45
閱讀 2318·2019-08-26 11:56
閱讀 1064·2019-08-26 11:43
閱讀 644·2019-08-26 10:45
閱讀 1326·2019-08-23 16:48
閱讀 2228·2019-08-23 16:07