字典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