字典是通過hash表的原理實現的,每個元素都是一個鍵值對,通過元素的鍵計算出一個唯一的哈希值,這個hash值決定了元素的地址,因此爲了保證元素地址不一樣,必須保證每個元素的鍵和對應的hash值是完全不同的,並且鍵的類型必須是不可修改的,所以鍵的類型可以使數值,字符串常量或元組,但不能是列表,因爲列表是可以被修改的。
所以字典具有下列特性:
1、元素的查詢和插入操作很快,基本上是常數級別
2、佔用內存較大,採用的是空間換時間的方法
參考地址:http://www.cnblogs.com/xianwang/p/4970448.html
字典的初始化
下面的方法都是等價的
d={'a':1, 'b':2, 'c':3}
d=dict({'a':1, 'b':2, 'c':3})
d = dict([('a',1), ('b', 2), ('c', 3)])
d = dict(a=1, b=2, c=3)
d = dict(zip(['a', 'b', 'c'], [1,2,3]))#這個方法也可以用作將兩個列表合併成一個字典
賦值元素
1、e = d#引用賦值,e、d始終是一樣的
2、e = d.copy()#值賦值,二者是沒有關聯的
3、d.copy()是一個淺拷貝,當鍵值對的值遇到字典或者列表時,字典或列表還會隨着原來的變化而變化,此時的值相當於元組或列表的引用或指針,而不是其本身,指向的元組或列表其實還是原來的。使用copy模塊的deepcopy()方法可以避免這種情況。
import copy dict1 = {'a': [1, 2], 'b': 3} dict2 = dict1 dict3 = dict1.copy() dict4 = copy.deepcopy(dict1) dict1['b'] = 'change' dict1['a'].append('change') print dict1 # {'a': [1, 2, 'change'], 'b': 'change'} print dict2 # {'a': [1, 2, 'change'], 'b': 'change'} print dict3 # {'a': [1, 2, 'change'], 'b': 3} print dict4 # {'a': [1, 2], 'b': 3}
增加元素
1、d['d'] = 4#直接通過下標添加,如果該鍵值已存在,那就是修改元素了,當然也可以訪問元素
刪除元素
1、d.clear()#刪除d中的所有元素
2、d.pop('a')#刪除鍵值爲‘a’的元素
3、del d['a']#刪除鍵值爲‘a’的元素
遍歷元素
for k in d:
print 'd[%s]=' % k,d[k]
或
for k,v in d.items():
print 'd[%s]=' % k,v
或
for k,v in d.iteritems():
print 'd[%s]=' % k,v
或
for k,v in d.viewitems():
print 'd[%s]=' % k,v
items(),iteritems()和viewitems()區別
參考地址:http://www.jb51.net/article/54116.htm
python2.x的 items() 就是返回一個像上面那樣的包含dict所有元素的list,但是由於這樣太浪費內存,所以後來就加入了(注:在Python 2.2開始出現的)iteritems(), iterkeys(), itervalues()這一組函數,用於返回一個 iterator 來節省內存,但是迭代器不能反映dict在調用這個函數之後的變化。所以就添加了viewitems(),始終代表最新的元素。Python3.x中只有一個items函數,這個函數與2.x中的viewitems()等價。
參考鏈接:http://www.tuicool.com/articles/rAzQfq
字典合併
1、dd = dict(dict1.items() + dict2.items())
但是這種效率不高,通過上面的分析指導,它實際上是調用items先返回對應的列表,然後執行列表相加,最後再按照列表初始化成字典的形式進行初始化
2、dd = dict(dict1, **dict2)
字典的鍵必須是字符串。在Python 2(解釋器是CPython)中,我們可以使用非字符串作爲鍵,但別被矇騙了:這種hack只是湊巧在使用標準CPython運行環境的Python 2中才有效。
上面語句相當於
dd = dict1.copy()
dd.update(dict2)
其中的dd.update(dict2)又相當於
for k in dict2
dd[k] = dict2[k]
可知update的作用不僅可以添加不存在的元素,還能修改已存在的鍵的元素值。
並且通過上面知道通過update和for...in也是可以合併字典的。
排序
#調用sorted()排序 dict = {"a" : "apple", "b" : "grape", "c" : "orange", "d" : "banana"} print dict #按照key排序 print sorted(dict.items(), key=lambda d: d[0]) #按照value排序 print sorted(dict.items(), key=lambda d: d[1]) ls = list(dict.keys()) ls.sort() for k in ls: print(k, dict[k]) for k in sorted(dict.keys()): print(k, dict[k])