溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python字典的概念及常見應用實例詳解

發布時間:2020-09-01 02:50:07 來源:腳本之家 閱讀:311 作者:閑魚!!! 欄目:開發技術

本文實例講述了Python字典的概念及常見應用。分享給大家供大家參考,具體如下:

字典的介紹

  • 字典的概念
  • 字典的創建
    • 1. 我們可以通過{}、dict()來創建字典對象。
    • 2. 通過 zip()創建字典對象
    • 3. 通過 fromkeys 創建值為空的字典
  • 字典元素的訪問
    • 1. 通過 [鍵] 獲得“值”。若鍵不存在,則拋出異常。
    • 2. 通過 get()方法獲得“值”。推薦使用。優點是:指定鍵不存在,返回 None;也可以設
    • 3. 列出所有的鍵值對
    • 4. 列出所有的鍵,列出所有的值
    • 5. len() 鍵值對的個數
    • 6. 檢測一個“鍵”是否在字典中
  • 字典元素添加、修改、刪除
    • 1. 給字典新增“鍵值對”
    • 2. 使用 update()
    • 3. 字典中元素的刪除
    • 4. popitem()
  • 序列解包
    • 序列解包可以用于元組、列表、字典。
    • 序列解包用于字典時
  • 表格數據使用字典和列表存儲,并實現訪問
  • 字典核心底層原理(重要)
    • 將一個鍵值對放進字典的底層過程
    • 擴容
  • 根據鍵查找“鍵值對”的底層過程
  • 用法總結:

字典的概念

字典是“鍵值對”的無序可變序列,字典中的每個元素都是一個“鍵值對”,包含:“鍵
對象”和“值對象”??梢酝ㄟ^“鍵對象”實現快速獲取、刪除、更新對應的“值對象”。
列表中我們通過“下標數字”找到對應的對象。字典中通過“鍵對象”找到對應的“值
對象”?!版I”是任意的不可變數據,比如:整數、浮點數、字符串、元組。但是:列表、
字典、集合這些可變對象,不能作為“鍵”。并且“鍵”不可重復。
“值”可以是任意的數據,并且可重復。
一個典型的字典的定義方式:

a = {'name':'gaoqi','age':18,'job':'programmer'}

字典的創建

1. 我們可以通過{}、dict()來創建字典對象。

>>> a = {'name':'gaoqi','age':18,'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','age','job'])
>>> a
{'name': None, 'age': None, 'job': None}

字典元素的訪問

為了測試各種訪問方法,我們這里設定一個字典對象:

a = {'name':'gaoqi','age':18,'job':'programmer'}

1. 通過 [鍵] 獲得“值”。若鍵不存在,則拋出異常。

>>> a = {'name':'gaoqi','age':18,'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', 'age', 'job'])
>>> a.values()
dict_values(['gaoqi', 18, 'programmer'])

5. len() 鍵值對的個數

6. 檢測一個“鍵”是否在字典中

>>> a = {"name":"gaoqi","age":18}
>>> "name" in a
True

字典元素添加、修改、刪除

1. 給字典新增“鍵值對”

如果“鍵”已經存在,則覆蓋舊的鍵值對;如果“鍵”不存在,則新增“鍵值對”。

>>>a = {'name':'gaoqi','age':18,'job':'programmer'}
>>> a['address']='西三旗 1 號院'
>>> a['age']=16
>>> a
{'name': 'gaoqi', 'age': 16, 'job': 'programmer', 'address': '西三旗 1 號院'}

2. 使用 update()

將新字典中所有鍵值對全部添加到舊字典對象上。如果 key 有重復,則直接覆蓋。

>>> a = {'name':'gaoqi','age':18,'job':'programmer'}
>>> b = {'name':'gaoxixi','money':1000,'sex':'男的'}
>>> a.update(b)
>>> a
{'name': 'gaoxixi', 'age': 18, 'job': 'programmer', 'money': 1000, 'sex': '男的'}

3. 字典中元素的刪除

可以使用 del()方法;或者 clear()刪除所有鍵值對;pop()刪除指定鍵值對,并返回對應的“值對象”;

>>> a = {'name':'gaoqi','age':18,'job':'programmer'}
>>> del(a['name'])
>>> a
{'age': 18, 'job': 'programmer'}
>>> b = a.pop('age')
>>> b
18

4. popitem()

隨機刪除和返回該鍵值對。字典是“無序可變序列”,因此沒有第一個元
素、最后一個元素的概念;popitem 彈出隨機的項,因為字典并沒有"最后的元素"或者其
他有關順序的概念。若想一個接一個地移除并處理項,這個方法就非常有效(因為不用首先
獲取鍵的列表)。

>>> a = {'name':'gaoqi','age':18,'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,b,c]=[10,20,30]
>>> a
10
>>> b
20

序列解包用于字典時

默認是對“鍵”進行操作; 如果需要對鍵值對操作,則需要使用items();如果需要對“值”進行操作,則需要使用 values();

>>> s = {'name':'gaoqi','age':18,'job':'teacher'}
>>> name,age,job=s #默認對鍵進行操作
>>> name
'name'
>>> name,age,job=s.items() #對鍵值對進行操作
>>> name
('name', 'gaoqi')
>>> name,age,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。
Python字典的概念及常見應用實例詳解

將一個鍵值對放進字典的底層過程

>>> a = {}
>>>
a["name"]="gaoqi"

假設字典 a 對象創建完后,數組長度為 8:
Python字典的概念及常見應用實例詳解
我們要把”name”=”gaoqi”這個鍵值對放到字典對象 a 中,首先第一步需要計算
鍵”name”的散列值。Python 中可以通過 hash()來計算。

>>> bin(hash("name"))
'-0b1010111101001110110101100100101'

由于數組長度為 8,我們可以拿計算出的散列值的最右邊 3 位數字作為偏移量,即
“101”,十進制是數字 5。我們查看偏移量 5,對應的 bucket 是否為空。如果為空,則
將鍵值對放進去。如果不為空,則依次取右邊 3 位作為偏移量,即“100”,十進制是數字
4。再查看偏移量為 4 的 bucket 是否為空。直到找到為空的 bucket 將鍵值對放進去。流
程圖如下:

Python字典的概念及常見應用實例詳解

擴容

python 會根據散列表的擁擠程度擴容?!皵U容”指的是:創造更大的數組,將原有內容
拷貝到新數組中。
接近 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。流程圖如下:
Python字典的概念及常見應用實例詳解

用法總結:

  1. 鍵必須可散列
    (1) 數字、字符串、元組,都是可散列的。
    (2) 自定義對象需要支持下面三點:
    • 支持 hash()函數
    • 支持通過__eq__()方法檢測相等性。
    • 若 a==b 為真,則 hash(a)==hash(b)也為真。
  2. 字典在內存中開銷巨大,典型的空間換時間。
  3. 鍵查詢速度很快
  4. 往字典里面添加新建可能導致擴容,導致散列表中鍵的次序變化。因此,不要在遍歷字典的同時進行字典的修改。

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python字典操作技巧匯總》、《Python列表(list)操作技巧總結》、《Python函數使用技巧總結》、《Python數據結構與算法教程》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女