核心筆記:什麼是哈希表?它們與字典的關係是什麼?python
序列類型用有序的數字鍵作索引將數據以數組的形式存儲。通常,索引值與所存儲的數據毫無算法
關係。還能夠用另外一種方式來存儲數據:基於某種相關值,好比說一個字符串。咱們在平常生活中數組
一直這麼作。你把人們的電話號碼按照他們的姓記錄在電話簿上,你按照時間在日曆或約會簿上添數據結構
加事件,等等。在這些例子中,你的鍵(key)就是和數據項相關的值。python2.7
哈希表是一種數據結構:它按照咱們所要求的去工做。哈希表中存儲的每一條數據,叫作一個函數
值(value),是根據與它相關的一個被稱做爲鍵(key)的數據項進行存儲的。鍵和值合在一塊兒被稱爲性能
「鍵-值 對」(key-value pairs)。 哈希表的算法是獲取鍵,對鍵執行一個叫作哈希函數的操做,this
並根據計算的結果,選擇在數據結構的某個地址中來存儲你的值。任何一個值存儲的地址皆取決於spa
它的鍵。正由於這種隨意性,哈希表中的值是沒有順序的。你擁有的是一個無序的數據集。code
你所能得到的有序集合只能是字典中的鍵的集合或者值的集合。方法 Keys() 或 values() 返回
一個列表,該列表是可排序的。 你還能夠用 items()方法獲得包含鍵、值對的元組的列表來排序。
因爲字典自己是哈希的,因此是無序的。
哈希表通常有很好的性能, 由於用鍵查詢至關快。
7-1
"""字典方法。哪一個字典方法能夠用來把兩個字典合併到一塊兒?""" """ Answer: (1) items(...) | D.items() -> list of D's (key, value) pairs, as 2-tuples (2) update(...) | D.update([E, ]**F) -> None. Update D from dict/iterable E and F. | If E present and has a .keys() method, does: for k in E: D[k] = E[k] | If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v | In either case, this is followed by: for k in F: D[k] = F[k] """ (1) >>> new = dict([ ("qwer"[i-1], i) for i in range(1, 5) ]) >>> new {'q': 1, 'r': 4, 'e': 3, 'w': 2} >>> old = dict([ ("asdf"[i-1], i) for i in range(1, 5) ]) >>> old {'a': 1, 's': 2, 'd': 3, 'f': 4} >>> res_add = dict( new.items() + old.items() ) >>> res_add {'a': 1, 'e': 3, 'd': 3, 'f': 4, 'q': 1, 's': 2, 'r': 4, 'w': 2} (2) >>> new.update(old) >>> new {'a': 1, 'e': 3, 'd': 3, 'f': 4, 'q': 1, 's': 2, 'r': 4, 'w': 2}
7-2.
字典的鍵。咱們知道字典的值能夠是任意的 Python 對象,那字典的鍵又如何呢?請試
着將除數字和字符串之外的其餘不一樣類型的對象做爲字典的鍵,看一看,哪些類型能夠,哪些不行?
對那些不能做字典的鍵的對象類型,你認爲是什麼緣由呢?
Answer:
Python 的字典是做爲可變的哈希表實現的,在執行中字典中的鍵不容許被改變。
好比:當建立了一個字典,字典中包含一個元素(一個鍵和一個值)。多是因爲某個變量的改變致使鍵發生了改變。這時候用原來的鍵來取出字典的數據,會獲得KeyError(由於鍵的值已經改變了),如今沒辦法從字典中獲取該值啦,由於鍵自己的值發生了變化。因爲字典中的鍵必須是可哈希的,因此數字和字符串能夠做爲字典中的鍵,可是列表和其餘字典不行。
( 1 )字典的鍵不容許一個鍵對應多個值,若是對應多個值,則取最後一個。
( 2 )鍵必須是可哈希的。
( 3 )若是用元祖作有效的鍵,必須加以限制:元祖中只包含像數字和字符串這樣的不可變參數,才能夠做爲字典中有效的 鍵。
7-3.
#!/usr/bin/env python # coding: utf-8 # author: toddlerya # date: Jan 18 2015 """ 7–3. 字典和列表的方法。 (a) 建立一個字典,並把這個字典中的鍵按照字母順序顯示出來。 (b) 如今根據已按照字母順序排序好的鍵,顯示出這個字典中的鍵和值。 (c)同(b),但此次是根據已按照字母順序排序好的字典的值,顯示出這個字典中的鍵和值。(注 意:對字典和哈希表來講,這樣作通常沒有什麼實際意義,由於大多數訪問和排序(若是須要)都是 基於字典的鍵,這裏只把它做爲一個練習。) """ # (a) and (b) print '-----------(a) and (b)-----------' dict1 = {'a': 'w', 'c': 'v', 'e': 'y', 'b': 'x', 'd': 'z'} for j in sorted(dict1): print "tht key is ", j, "and the value is ", dict1[j] # (c) print '----------------(c)--------------\n' for value in sorted(dict1.values()): for key in dict1.keys(): if dict1[key] == value: print "The key is", key, "The value is", value
/usr/bin/python2.7 /home/toddler/Documents/learn_python/python_core_pragrams/Chapter_7/7-3.py -----------(a) and (b)----------- tht key is a and the value is w tht key is b and the value is x tht key is c and the value is v tht key is d and the value is z tht key is e and the value is y ----------------(c)-------------- The key is c The value is v The key is a The value is w The key is b The value is x The key is e The value is y The key is d The value is z Process finished with exit code 0
7-4.
#!/usr/bin/env python # coding: utf-8 # author: toddlerya # date: Jan 18 2015 """ 7-4. 創建字典。給定兩個長度相同的列表,好比說, 列表[1, 2, 3,...]和['abc', 'def','ghi',...], 用這兩個列表裏的全部數據組成一個字典,像這樣:{1:'abc', 2: 'def', 3: 'ghi',...} """ list1 = [1, 2, 3, 4, 5] list2 = ['abc', 'def', 'ghi', 'jkl', 'mno'] dict1 = dict([(list1[int(i-1)], list2[i-1]) for i in list1]) print dict1