Python字典的概念及常見應用例項詳解
本文例項講述了Python字典的概念及常見應用。分享給大家供大家參考,具體如下:
字典的介紹
- 字典的概念
- 字典的建立
- 1. 我們可以通過{}、dict()來建立字典物件。
- 2. 通過 zip()建立字典物件
- 3. 通過 fromkeys 建立值為空的字典
- 字典元素的訪問
- 1. 通過 [鍵] 獲得“值”。若鍵不存在,則丟擲異常。
- 2. 通過 get()方法獲得“值”。推薦使用。優點是:指定鍵不存在,返回 None;也可以設
- 3. 列出所有的鍵值對
- 4. 列出所有的鍵,列出所有的值
- 5. len() 鍵值對的個數
- 6. 檢測一個“鍵”是否在字典中
- 字典元素新增、修改、刪除
- 1. 給字典新增“鍵值對”
- 2. 使用 update()
- 3. 字典中元素的刪除
- 4. popitem()
- 序列解包
- 序列解包可以用於元組、列表、字典。
- 序列解包用於字典時
- 表格資料使用字典和列表儲存,並實現訪問
- 字典核心底層原理(重要)
- 將一個鍵值對放進字典的底層過程
- 擴容
- 根據鍵查詢“鍵值對”的底層過程
- 用法總結:
字典的概念
字典是“鍵值對”的無序可變序列,字典中的每個元素都是一個“鍵值對”,包含:“鍵
列表中我們通過“下標數字”找到對應的物件。字典中通過“鍵物件”找到對應的“值
物件”。“鍵”是任意的不可變資料,比如:整數、浮點數、字串、元組。但是:列表、
字典、集合這些可變物件,不能作為“鍵”。並且“鍵”不可重複。
“值”可以是任意的資料,並且可重複。
一個典型的字典的定義方式:
a = {'name':'gaoqi','age':18,'job':'programmer'}
字典的建立
1. 我們可以通過{}、dict()來建立字典物件。
>>> a = {'name':'gaoqi','job':'programmer'} >>> b = dict(name='gaoqi',age=18,job='programmer') >>> a = dict([("name","gaoqi"),("age",18)]) >>> c = {} #空的字典物件 >>> d = dict() #空的字典物件
2. 通過 zip()建立字典物件
>>> k = ['name','age','job'] >>> v = ['gaoqi',18,'techer'] >>> d = dict(zip(k,v)) >>> d {'name': 'gaoqi','age': 18,'job': 'techer'}
3. 通過 fromkeys 建立值為空的字典
>>> a = dict.fromkeys(['name','job']) >>> a {'name': None,'age': None,'job': None}
字典元素的訪問
為了測試各種訪問方法,我們這裡設定一個字典物件:
a = {'name':'gaoqi','job':'programmer'}
1. 通過 [鍵] 獲得“值”。若鍵不存在,則丟擲異常。
>>> a = {'name':'gaoqi','job':'programmer'} >>> a['name'] 'gaoqi' >>> a['age'] 18 >>> a['sex'] Traceback (most recent call last): File "<pyshell#374>",line 1,in <module> a['sex'] KeyError: 'sex'
2. 通過 get()方法獲得“值”。推薦使用。優點是:指定鍵不存在,返回 None;也可以設
定指定鍵不存在時預設返回的物件。推薦使用 get()獲取“值物件”。
>>> a.get('name') 'gaoqi' >>> a.get('sex') >>> a.get('sex','一個男人') '一個男人'
3. 列出所有的鍵值對
>>> a.items() dict_items([('name','gaoqi'),('age',18),('job','programmer')])
4. 列出所有的鍵,列出所有的值
>>> a.keys() dict_keys(['name','job']) >>> a.values() dict_values(['gaoqi','programmer'])
5. len() 鍵值對的個數
6. 檢測一個“鍵”是否在字典中
>>> a = {"name":"gaoqi","age":18} >>> "name" in a True
字典元素新增、修改、刪除
1. 給字典新增“鍵值對”
如果“鍵”已經存在,則覆蓋舊的鍵值對;如果“鍵”不存在,則新增“鍵值對”。
>>>a = {'name':'gaoqi','job':'programmer'} >>> a['address']='西三旗 1 號院' >>> a['age']=16 >>> a {'name': 'gaoqi','age': 16,'job': 'programmer','address': '西三旗 1 號院'}
2. 使用 update()
將新字典中所有鍵值對全部新增到舊字典物件上。如果 key 有重複,則直接覆蓋。
>>> a = {'name':'gaoqi','job':'programmer'} >>> b = {'name':'gaoxixi','money':1000,'sex':'男的'} >>> a.update(b) >>> a {'name': 'gaoxixi','money': 1000,'sex': '男的'}
3. 字典中元素的刪除
可以使用 del()方法;或者 clear()刪除所有鍵值對;pop()刪除指定鍵值對,並返回對應的“值物件”;
>>> a = {'name':'gaoqi','job':'programmer'} >>> del(a['name']) >>> a {'age': 18,'job': 'programmer'} >>> b = a.pop('age') >>> b 18
4. popitem()
隨機刪除和返回該鍵值對。字典是“無序可變序列”,因此沒有第一個元
素、最後一個元素的概念;popitem 彈出隨機的項,因為字典並沒有"最後的元素"或者其
他有關順序的概念。若想一個接一個地移除並處理項,這個方法就非常有效(因為不用首先
獲取鍵的列表)。
>>> a = {'name':'gaoqi','job':'programmer'} >>> a.popitem() ('job','programmer') >>> a {'name': 'gaoqi','age': 18} >>> a.popitem() ('age',18) >>> a {'name': 'gaoqi'}
序列解包
序列解包可以用於元組、列表、字典。
序列解包可以讓我們方便的對多個變數賦值。
>>> x,y,z=(20,30,10) >>> x 20 >>> y 30 >>> z 10 >>> (a,b,c)=(9,8,10) >>> a 9 >>> [a,c]=[10,20,30] >>> a 10 >>> b 20
序列解包用於字典時
預設是對“鍵”進行操作; 如果需要對鍵值對操作,則需要使用items();如果需要對“值”進行操作,則需要使用 values();
>>> s = {'name':'gaoqi','job':'teacher'} >>> name,age,job=s #預設對鍵進行操作 >>> name 'name' >>> name,job=s.items() #對鍵值對進行操作 >>> name ('name','gaoqi') >>> name,job=s.values() #對值進行操作 >>> name 'gaoqi'
表格資料使用字典和列表儲存,並實現訪問
姓名 | 年齡 | 薪資 | 城市 |
---|---|---|---|
高小一 | 18 | 30000 | 北京 |
高小二 | 19 | 20000 | 上海 |
高小五 | 20 | 10000 | 深圳 |
原始碼(mypy_09.py):
r1 = {"name":"高小一","age":18,"salary":30000,"city":"北京"} r2 = {"name":"高小二","age":19,"salary":20000,"city":"上海"} r3 = {"name":"高小五","age":20,"salary":10000,"city":"深圳"} tb = [r1,r2,r3] #獲得第二行的人的薪資 print(tb[1].get("salary")) #打印表中所有的的薪資 for i in range(len(tb)): # i -->0,1,2 print(tb[i].get("salary")) #打印表的所有資料 for i in range(len(tb)): print(tb[i].get("name"),tb[i].get("age"),tb[i].get("salary"),tb[i].get("city"))
字典核心底層原理(重要)
字典物件的核心是散列表。散列表是一個稀疏陣列(總是有空白元素的陣列),陣列的
每個單元叫做 bucket。每個 bucket 有兩部分:一個是鍵物件的引用,一個是值物件的引
用。
由於,所有 bucket 結構和大小一致,我們可以通過偏移量來讀取指定 bucket。
將一個鍵值對放進字典的底層過程
>>> a = {} >>> a["name"]="gaoqi"
假設字典 a 物件建立完後,陣列長度為 8:
我們要把”name”=”gaoqi”這個鍵值對放到字典物件 a 中,首先第一步需要計算
鍵”name”的雜湊值。Python 中可以通過 hash()來計算。
>>> bin(hash("name")) '-0b1010111101001110110101100100101'
由於陣列長度為 8,我們可以拿計算出的雜湊值的最右邊 3 位數字作為偏移量,即
“101”,十進位制是數字 5。我們檢視偏移量 5,對應的 bucket 是否為空。如果為空,則
將鍵值對放進去。如果不為空,則依次取右邊 3 位作為偏移量,即“100”,十進位制是數字
4。再檢視偏移量為 4 的 bucket 是否為空。直到找到為空的 bucket 將鍵值對放進去。流
程圖如下:
擴容
python 會根據散列表的擁擠程度擴容。“擴容”指的是:創造更大的陣列,將原有內容
拷貝到新陣列中。
接近 2/3 時,陣列就會擴容。
根據鍵查詢“鍵值對”的底層過程
我們明白了,一個鍵值對是如何儲存到陣列中的,根據鍵物件取到值物件,理解起來就
簡單了。
>>> a.get("name") 'gaoqi'
當我們呼叫 a.get(“name”),就是根據鍵“name”查詢到“鍵值對”,從而找到值
物件“gaoqi”。
第一步,我們仍然要計算“name”物件的雜湊值:
>>> bin(hash("name")) '-0b1010111101001110110101100100101'
和儲存的底層流程演算法一致,也是依次取雜湊值的不同位置的數字。 假設陣列長度為
8,我們可以拿計算出的雜湊值的最右邊 3 位數字作為偏移量,即“101”,十進位制是數字
5。我們檢視偏移量 5,對應的 bucket 是否為空。如果為空,則返回 None。如果不為空,
則將這個 bucket 的鍵物件計算對應雜湊值,和我們的雜湊值進行比較,如果相等。則將對
應“值物件”返回。如果不相等,則再依次取其他幾位數字,重新計算偏移量。依次取完後,
仍然沒有找到。則返回 None。流程圖如下:
用法總結:
- 鍵必須可雜湊
(1) 數字、字串、元組,都是可雜湊的。
(2) 自定義物件需要支援下面三點:- 支援 hash()函式
- 支援通過__eq__()方法檢測相等性。
- 若 a==b 為真,則 hash(a)==hash(b)也為真。
- 字典在記憶體中開銷巨大,典型的空間換時間。
- 鍵查詢速度很快
- 往字典裡面新增新建可能導致擴容,導致散列表中鍵的次序變化。因此,不要在遍歷字典的同時進行字典的修改。
更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python字典操作技巧彙總》、《Python列表(list)操作技巧總結》、《Python函式使用技巧總結》、《Python資料結構與演算法教程》、《Python字串操作技巧彙總》及《Python入門與進階經典教程》
希望本文所述對大家Python程式設計有所幫助。