Python字典 (dictionary)


字典dict,是Python唯一的標准mapping類型,也是內置在Python解釋器中的。

mapping object把一個可哈希的值(hashable value)映射到一個任意的object上。

什么是可哈希的

一個object是可哈希的(hashable), 是指這個object在其生存期內有一個不變的哈希值(hash value),即__hash__()方法返回的值。

所有不可變的(immutable)內置object都是hashable的,比如string,tuple。所有可變的(mutable)內置容器不是hashable的,比如list,dict(即沒有__hash__()方法)。而所有自定義的類(use-defined class)對象都是可哈希的hashable),並且只能和自己相等,其hashvalue為其id(object)的值,這里的id()為內置函數,CPython實現的時候取的對象在內存中的地址。

字典Dictionary的key必須是可哈希的,所以tuple,string可以做key,而list不能做key,關於這個我以后會專門解釋,或參見文末參考第3篇

dict本身是一個類

class dict(mapping)

1,字典的創建

>>> d = dict({1:'a', 2:'b', 3:'c'})      #通過dict類來構建
>>> d
{1: 'a', 2: 'b', 3: 'c'}
>>> d2 = {1:'a', 2:'b', 3:'c'}           #直接構建,注意語法,大括號,冒號,逗號
>>> d2
{1: 'a', 2: 'b', 3: 'c'}

 

2,dictionary支持的操作

作為Python唯一的標准mapping type,dictionary支持了增,刪,查,整體更新等操作。

一部分操作是由dict的成員函數實現的,一部分操作是由Python的內置函數(built-in)function實現的,也有使用Python的del語句

 2.1 引用元素

直接用d[key],就可以得到key所對應得那個object,但是如果key不存在呢,如果使用的就是標准的dict,那么會拋出KeyError異常。但是如果我們是自己從dict派生了一個自己的dictionary,那么只要我們定義__missing__函數,當key不存在時,這個函數會以key做為參數被調用,我們試驗一下。

寫一個module  ,mdict.py

1 class myDict(dict):
2         def __missing__(self, key):
3                 print "__missing__ called , key = ", key
4 return "^_^"

然后打開Python命令行解釋器,import mdict

>>> from mdict import myDict
>>> d = myDict({1:'a', 2:'b', 3:'c'})
>>> d
{1: 'a', 2: 'b', 3: 'c'}
>>> d[1]
'a'
>>> d[4]
__missing__ called , key =  4
^_^

可以看到__missing__()被調用了。

如果只想得到某個key對應的value,不想對其進行改變,則用對象方法get() ,這類似C++中“引用”和“值”的概念。

>>> a = d.get(1)
>>> a
'a'

 

2.2  類方法實現的操作

>>>d.clear()     #清空

>>>d.copy()     #拷貝生成另一個,淺拷貝(shallow copy)

d.keys(),d.values(),d.items()

這三個都會生成dictionary相應的keys,values,items的copy,返回結果都是list,d.items()生成的是(key,value)二元tuple的list

>>> d.items()
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> d.keys()
[1, 2, 3]
>>> d.values()
['a', 'b', 'c']

d.viewkeys(),d.viewvalues(),d.viewitems()

這三個都會生成dictionary相應的view object,view object是dictionary中(key,value)的動態反映,當dictionary中的內容變化時,view object也會變。

>>> viewkeys = d.viewkeys()
>>> viewkeys
dict_keys([1, 2, 3])
>>> list(viewkeys)
[1, 2, 3]
>>> del d[1]
>>> list(viewkeys)
[2, 3]

 

2.3 內置函數實現的操作

>>>len(d)    #dictionary的長度

>>>del d[key]  或  del  d      #del語句

>>>key in d 或 key not in d     #返回True or False 

 

 

3, 字典的bool判斷

Python的對象都可以直接用來判斷其bool值,對內置的字典來說,當其為空時為False,不為空時True

>>> d = {}
>>> bool(d)
False

 

 

 

參考:

1,  http://docs.python.org/3/library/stdtypes.html#mapping-types-dict   Python 標准庫

2,  http://docs.python.org/3/glossary.html#term-hashable   Python 術語

3,  http://wiki.python.org/moin/DictionaryKeys   為什么List不能做dictionary的key


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM