Python字典是另外一種可變容器模型,且可存儲任意類型對象,如字符串、數字、元組等其餘容器模型。
1、建立字典
(一)字典的增刪改查
(1)字典的建立
key:(不可變類型)數字、字符串、元組
value:任何類型tcp
>>> dict1={} >>> dict2={'name': 'earth', 'port': 80} >>> dic1,dict2 ({}, {'name': 'earth', 'port': 80})
若是鍵值是列表,會報錯函數
>>>dict1[[1,2]]={"aa","bbb"} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
鍵爲元組:code
>>> dict1[1,2]={"sss","ggg"} >>> dict1 {(1, 2): set(['ggg', 'sss']), 'name': 'aileen', 'sex': u'\u5973'}
用工廠的方法建立字典:server
>>> fdict = dict((['x', 1], ['y', 2])) >>> fdict {'y': 2, 'x': 1} >>> fdict=dict(a=3,b=4) #這個比較經常使用 >>> fdict {'a': 3, 'b': 4}
內建方法 fromkeys() 來建立一個"默認"字典:
dict.fromkeys(seq[, value]))
seq -- 字典鍵值列表。
value -- 可選參數, 設置鍵序列(seq)的值。對象
>>> ddict = {}.fromkeys(('x', 'y'), -1) >>> ddict {'y': -1, 'x': -1} >>> edict = {}.fromkeys(('foo', 'bar')) >>> edict {'foo': None, 'bar': None}
(2)訪問字典的值:字典是無序的因此不能用索引進行訪問排序
>>> dict2 = {'name': 'earth', 'port': 80} >>> for key in dict2.keys(): ... print "key=%s,value=%s"%(key,dict2[key]) key=name,value=earth key=port,value=80 >>> for key,value in dict2.items(): ... print key,value name earth port 80 >>> for value in dict2.values(): ... print value earth 80
想訪問該字典中的一個數據元素,而它在這個字典中沒有對應的鍵,將會產生一個錯誤:索引
>>> dict2["sever"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'sever'
字典的方法:has_key()和 in 以及 not in 操做符都是布爾類型的。
對於前二者而言,若是字典中有該鍵就返回真(True),不然返回假(False)。ip
>>> "sever" in dict2 #dict2.has_key("server") False >>> "name" in dict2 #dict2.has_key("name") True >>> "earth" in dict2.values() True
(3)字典的更新
經過如下幾種方式對一個字典作修改:添加一個新數據項或新元素(即:一個鍵-值對);修改一個已存在的數據項;或刪除一個已存在的數據項內存
>>> dict2['name'] = 'venus' #更新已有的條目 >>> dict2['port'] = 6969 #更新已有的條目 >>> dict2['arch'] = 'sunos5' #增長新條目 >>> print "host %(name)s is running on port %(port)d"%dict2 host venus is running on port 6969
注:(1)若是字典中該鍵已經存在,則字典中該鍵對應的值將被新值替代。
(2)上面的 print 語句展現了另外一種在字典中使用字符串格式符( %)的方法。用字典參數能夠簡化 print 語句,由於這樣作你只須用到一次該字典的名字,而不用在每一個元素出現的時候都用元組參數表示。字符串
(4)刪除字典元素和字典
>>> del dict2["name"] #刪除鍵爲」name」的條目 >>> dict2.clear() #刪除dict2中全部的條目 >>> del dict2 #刪除整個dict2字典 >>> dict2.pop("name") #刪除並返回鍵爲」name」的條目
(二)字典相關函數
(1)dict()-工廠方法
工廠函數被用來建立字典。若是不提供參數,會生成空字典
>>> dict(zip(('x', 'y'), (1, 2))) {'y': 2, 'x': 1} >>> dict([['x', 1], ['y', 2]]) {'y': 2, 'x': 1} >>> dict([('xy'[i-1], i) for i in range(1,3)]) {'y': 2, 'x': 1}
調用 dict()方法能夠接受字典或關鍵字參數字典
>>> dict8=dict(x=1,y=2) >>> dict8 {'y': 2, 'x': 1} >>> dict9=dict(**dict8) #只做爲了解 dict()方法的用途 >>> dict9 {'y': 2, 'x': 1} >>> dict9=dict8.copy() #此方法效率更好 >>> dict9 {'y': 2, 'x': 1}
注:copy:dict三、dict2內存不一樣,改變一個另一個不變
>>> dict3=dict2.copy() >>> dict3 {'1': 1, '3': 3, '2': 2} >>> dict3["1"]=4 >>> dict2 {'1': 1, '3': 3, '2': 2} >>> id(dict3) 4323369880 >>> id(dict2) 4323370160 >>> id(dict2) 4323370160
引用,修改了一個另外一個也改了
>>> dict4=dict2 >>> id(dict4) 4323370160 >>> id(dict2) 4323370160
(2)len()
對字典調用 len(),它會返回全部元素(鍵-值對)的數目
>>> dict2 = {'name': 'earth', 'port': 80} >>> len(dict2) 2
(3)hash():
判斷某個對象是否能夠作一個字典的鍵,若是非可哈希類型做爲參數傳遞給 hash()方法,會產生TypeError 錯誤.返回的是返回 obj 的哈希值
>>> hash(3) 3 >>> hash([]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>> dict2[{}]="foo" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'dict'
(4)update函數
能夠用來將一個字典的內容添加到另一個字典中,字典中原有的鍵若是與新添加的鍵重複,那麼重複鍵所對應的原有條目的值將被新鍵所對應的值所覆蓋。原來不存在的條目則被添加到字典中。
>>> dict2= {'host':'earth', 'port':80} >>> dict3= {'host':'venus', 'server':'http'} >>> dict2.update(dict3) >>> dict2 {'host': 'venus', 'port': 80, 'server': 'http'} >>> dict2.update({"ip":"192.168.1.1"}) >>> dict2 {'ip': '192.168.1.1', 'host': 'venus', 'port': 80, 'server': 'http'}
(5)get()方法
get方法與鍵查找(key-lookup)操做符( [ ] )類似,不一樣的是它容許你爲不存在的
鍵提供默認值。若是該鍵不存在,也未給出它的默認值,則返回 None。此方法比採用鍵查找(key-lookup)更靈活,由於你沒必要擔憂因鍵不存在而引起異常。
dict的get方法:
>>> dict2 {'ip': '192.168.1.1', 'host': 'venus', 'port': 80, 'server': 'http'} >>> dict2.get("host") 'venus' >>> dict2.get("XXX") >>> type(dict2.get("XXX")) <type 'NoneType'> >>> dict2.get("XXX","no such key") 'no such key'
(6)Setdefault
檢查字典中是否含有某鍵。 若是字典中這個鍵存在,你能夠取到它的值。 若是所找的鍵在字典中不存在,你能夠給這個鍵賦默認值並返回此值。
>>> myDict = {'host': 'earth', 'port': 80} >>> myDict.keys() ['host', 'port'] >>> myDict.items() [('host', 'earth'), ('port', 80)] >>> myDict.setdefault("port",8080) 80 >>> myDict.setdefault("pot","tcp") 'tcp' >>> myDict.items() [('host', 'earth'), ('port', 80), ('pot', 'tcp')]
(7)Fromkeys(seq,value=None)
建立並返回一個新字典,以 seq 中的元素作該字典的鍵,val 作該字典中全部鍵對應的初始值(若是不提供此值,則默認爲 None)
>>> {}.fromkeys('xyz') {'y': None, 'x': None, 'z': None} >>> {}.fromkeys(('love', 'honor'), True) {'love': True, 'honor': True}
(8)Sorted()
dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0} print sorted(dic.iteritems(), key=lambda d:d[0], reverse = False )
按照value 排序:
dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0} print sorted(dic.iteritems(), key=lambda d:d[1], reverse = False )
能夠用如下方法作
>>> d={3:13,2:12,1:21} >>> sorted_key=sorted(d.keys()) >>> for i in sorted_key: ... print "%s =%s " %(i,d[i])
(9)dict.iter()
方法 iteritems(), iterkeys(), itervalues()與它們對應的非迭代方法同樣,不一樣的是它們返回一個迭代器,而不是一個列表。
(10)dict.pop(key[, default]) 與popitem函數
方法 get()類似,若是字典中 key 鍵存在,刪除並返回 dict[key],
若是 key 鍵不存在,且沒有給出 default 的值,引起 KeyError 異常。
>>> myDict {'host': 'earth', 'port': 80, 'pot': 'tcp'} >>> myDict.pop("host") #pop 'earth' >>> myDict.pop("hostt","none") 'none' >>> myDict.pop("hostt") Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'hostt' >>> myDict.popitem() #popitem ('host', 'earth') >>> myDict.popitem() ('port', 80) >>> myDict.popitem() ('pot', 'tcp') >>> myDict.popitem() Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'popitem(): dictionary is empty'