python-數據類型之字典

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'
相關文章
相關標籤/搜索