0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python序列的字典類型介紹

麥辣雞腿堡 ? 來源:CSDN博客 ? 作者:時(shí)間靜止不是簡(jiǎn)史 ? 2023-03-08 17:35 ? 次閱讀

字典

介紹

字典是“鍵值對(duì)”的無序可變序列,字典中的每個(gè)元素都是一個(gè)“鍵值對(duì)”,包含:“鍵對(duì)象”和“值對(duì)象”。

可以通過“鍵對(duì)象”實(shí)現(xiàn)快速獲取、刪除、更新對(duì)應(yīng)的“值對(duì)象”

字典特點(diǎn):

無序, 可變, 大括號(hào) {} + 鍵值對(duì) k,v

字典是 Python 項(xiàng)目中最常用的序列類型之一, 對(duì)應(yīng)Java 中常用的 Json 數(shù)據(jù)類型

操作

字典的創(chuàng)建

通過 {} + kv

來創(chuàng)建

通過dict()來創(chuàng)建字典對(duì)象(兩種方式)

過zip()創(chuàng)建字典對(duì)象

通過fromkeys創(chuàng)建值為空的字典

字典(類比Json)

“鍵”是任意的不可變數(shù)據(jù),比如:整數(shù)、浮點(diǎn)數(shù)、字符串、元組. 但是:列表、字典、集合這些可變對(duì)象,不能作為“鍵”.

并且“鍵”不可重復(fù)。

#“值”可以是任意的數(shù)據(jù),并且可重復(fù)

1. 通過{} 創(chuàng)建字典

a = {'name': 'TimePause',

'age': 18, 'sex': 'man'}

print(a)

2. 通過dict()來創(chuàng)建字典對(duì)象(兩種方式)

b =

dict(name='TimePause', age=18, sex='man')

a = dict([("name", "TimePause"),

("age", 18)])

print(b)

print(a)

c = {} # 空的字典對(duì)象

d = dict() #

空的字典對(duì)象

print(c)

print(d)

3. 通過zip()創(chuàng)建字典對(duì)象

k = ["name", "age",

"sex"]

v = ["TimePause", 18, "man"]

d = dict(zip(k, v))

print(d) #

{'name': 'TimePause', 'age': 18, 'sex': 'man'}

4. 通過fromkeys創(chuàng)建值為空的字典

f =

dict.fromkeys(["name", "age", "sex"])

print(f) # {'name': None, 'age': None,

'sex': None}

元素的訪問:

字典元素的訪問

a = {'name': 'TimePause', 'age': 18, 'sex': 'man'}

1. 通過

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

b = a["name"]

print(b)

#c = a["birthday"]

KeyError: 'birthday'

#print(c)

2. 通過get()方法獲得“值”. 推薦使用.

優(yōu)點(diǎn)是:指定鍵不存在,返回None;也可以設(shè)定指定鍵不存在時(shí)默認(rèn)返回的對(duì)象. 推薦使用get()獲取“值對(duì)象”

b =

a.get("name")

c = a.get("birthday")

d = a.get("birthday",

"值不存在")

print(b)

print(c)

print(d)

3. 列出所有的鍵值對(duì)

b =

a.items()

print(b) # dict_items([('name', 'TimePause'), ('age', 18), ('sex',

'man')])

4. 列出所有的鍵,列出所有的值

k = a.keys()

v = a.values()

print(k, v)

dict_keys(['name', 'age', 'sex']) dict_values(['TimePause', 18, 'man'])

  1. len() 鍵值對(duì)的個(gè)數(shù)

    b = len(a)

    print(b)

6. 檢測(cè)一個(gè)“鍵”是否在字典中

print("name"

in a) # True

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

  1. 給字典新增“鍵值對(duì)”。如果“鍵”已經(jīng)存在,則覆蓋舊的鍵值對(duì);如果“鍵”不存在,則新增“鍵值對(duì)

a =

{'name': 'TimePause', 'age': 18, 'sex': 'man'}

a['name'] =

"時(shí)間靜止"

a['phone'] = 18322222222

print(a)

  1. 使用 update()

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

a = {'name': 'TimePause', 'age': 18,

'sex': 'man'}

b = {'name': '時(shí)間靜止', 'age': 18, 'phone':

18322222222}

a.update(b) # 舊字典.update(新字典)

print(a)

  1. 字典中元素的刪除,可以使用

del() 方法;或者 clear() 刪除所有鍵值對(duì); pop() 刪除指定鍵值對(duì),并返回對(duì)應(yīng)的“值對(duì)象

a = {'name':

'TimePause', 'age': 18, 'sex': 'man'}

del (a["name"])

print(a) # {'age':

18, 'sex': 'man'}

a.pop("age")

print(a) # {'sex': 'man'}

popitem() :以后入先出的方式刪除和返回該鍵值對(duì)

#刪除并返回一個(gè)(鍵,值)對(duì)作為 2 元組。對(duì)以 LIFO(后進(jìn)先出)順序返回。如果 dict

為空,則引發(fā) KeyError。

a = {'name': 'TimePause', 'age': 18, 'sex':

'man'}

a.popitem()

print("第一次調(diào)用popitem",

a)

a.popitem()

print("第二次調(diào)用popitem",

a)

a.popitem()

print("第三次調(diào)用popitem", a)

#a.popitem() # KeyError:

'popitem(): dictionary is empty'

#print("第四次調(diào)用popitem", a)

序列解包

序列解包可以用于元組、列表、字典。序列解包可以讓我們方便的對(duì)多個(gè)變量賦值

#序列解包

#序列解包可以用于元組、列表、字典。序列解包可以讓我們方便的對(duì)多個(gè)變量賦值

x, y, z = (20, 30, 10) #

變量

(a, b, c) = (9, 8, 10) # 元組

[m, n, p] = [10, 20, 30] # 列表

序列解包用于字典時(shí),默認(rèn)是對(duì)“鍵”進(jìn)行操作;

a = {'name': 'TimePause', 'age': 18, 'sex':

'man'}

name, age, sex = a

print(name)

如果需要對(duì)鍵值對(duì)操作,則需要使用items()

name, age, sex = a.items()

print(name)

如果需要對(duì)“鍵”進(jìn)行操作,則需要使用keys()

name, age, sex = a.keys()

print(name)

如果需要對(duì)“值”進(jìn)行操作,則需要使用values()

name, age, sex = a.values()

print(name)

18

表格數(shù)據(jù)使用字典和列表存儲(chǔ)訪問

#表格數(shù)據(jù)使用字典和列表存儲(chǔ)訪問

#定義字典對(duì)象

a1 = {"name": "才子隊(duì)", "season": 1, "winner":

"比爾"}

a2 = {"name": "九頭蛇隊(duì)", "season": 2, "winner": "皮爾斯"}

a3 = {"name":

"巨亨隊(duì)", "season": 3, "winner": "卡羅爾"}

#定義列表對(duì)象tl

tl = [a1, a2,

a3]

print(tl)

print(tl[1].get("name"))

#輸出所有獲勝人員名稱

for x in

range(3):

print(tl[x].get("winner"))

#打印表的所有數(shù)據(jù)

for i in

range(len(tl)):

print(tl[i].get("name"), tl[i].get("season"),

tl[i].get("winner"))

字典核心底層原理(重要)

: 將一個(gè)鍵值對(duì)放進(jìn)字典的底層過程

字典對(duì)象的核心是散列表. 散列表是一個(gè)稀疏數(shù)組(總是有空白元素的數(shù)組)

數(shù)組的每個(gè)單元叫做 bucket. 每個(gè) bucket

有兩部分:一個(gè)是鍵對(duì)象的引用,一個(gè)是值對(duì)象的引用

由于所有 bucket 結(jié)構(gòu)和大小一致,我們可以通過偏移量來讀取指定bucket

下面操作將一個(gè)鍵值對(duì)放入字典

假設(shè)字典a對(duì)象創(chuàng)建完后,數(shù)組長(zhǎng)度為8

a =

{}

a["name"]="比爾"

我們要把”name”=”比爾”這個(gè)鍵值對(duì)放到字典對(duì)象a中,

首先第一步需要計(jì)算鍵”name”的散列值。Python中可以通過hash()來計(jì)算。

下面我們通過

Python Console 來查看 name 的hash值

bin(hash("name"))

'-0b1010111101001110110101100100101'

由于數(shù)組長(zhǎng)度為8,我們可以拿計(jì)算出的散列值的最右邊3位數(shù)字作為偏移量,即“101”,十進(jìn)制是數(shù)字5。

我們查看偏移量6對(duì)應(yīng)的bucket是否為空

如果為空,則將鍵值對(duì)放進(jìn)去。如果不為空,則依次取右邊3位作為偏移量,即“100”,十進(jìn)制是數(shù)字4

再查看偏移量為7的bucket是否為空。直到找到為空的bucket將鍵值對(duì)放進(jìn)去.

流程圖如下:

字典擴(kuò)容

python會(huì)根據(jù)散列表的擁擠程度擴(kuò)容?!皵U(kuò)容”指的是:創(chuàng)造更大的數(shù)組,將原有內(nèi)容拷貝到新數(shù)組中。

接近2/3時(shí),數(shù)組就會(huì)擴(kuò)容

二. 根據(jù)鍵查找“鍵值對(duì)”的底層過程

通過 Python console() 查看字典元素值如下

a.get("name")

'比爾'

1

2

當(dāng)調(diào)用a.get(“name”),就是根據(jù)鍵“name”查找到“鍵值對(duì)”,從而找到值對(duì)象“比爾”。

我們?nèi)匀灰紫扔?jì)算“name”對(duì)象的散列值:

bin(hash("name"))

'-0b1010111101001110110101100100101'

1

2

和存儲(chǔ)的底層流程算法一致,也是依次取散列值的不同位置的數(shù)字。

假設(shè)數(shù)組長(zhǎng)度為8,我們可以拿計(jì)算出的散列值的最右邊3位數(shù)字作為偏移量,即

101 ,十進(jìn)制是數(shù)字5。

我們查看偏移量5,對(duì)應(yīng)的 bucket 是否為空。如果為空,則返回 None 。

如果不為空,則將這個(gè) bucket

的鍵對(duì)象計(jì)算對(duì)應(yīng)散列值,和我們的散列值進(jìn)行比較,

如果相等。則將對(duì)應(yīng)“值對(duì)象”返回。

如果不相等,則再依次取其他幾位數(shù)字,重新計(jì)算偏移量。依次取完后,仍然沒有找到。則返回None

。

流程圖如下:

用法總結(jié):

字典在內(nèi)存中開銷巨大 (空間換時(shí)間)

鍵查詢速度很快

(通過位運(yùn)算+Hash運(yùn)算)

往字典里面添加新鍵值對(duì)可能導(dǎo)致擴(kuò)容,導(dǎo)致散列表中鍵的次序變化。

因此,不要在遍歷字典的同時(shí)進(jìn)行字典的修改

鍵必須可散列

數(shù)字、字符串、元組,都是可散列的

如果是自定義對(duì)象,

需要支持下面三點(diǎn):

(1) 支持 hash() 函數(shù) (2) 支持通過 eq () 方法檢測(cè)相等性 (3) 若 a==b 為真,則

hash(a)==hash(b) 也為真

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3565

    瀏覽量

    93536
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    575

    瀏覽量

    20468
  • 元素
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

    8410
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Python中常用的數(shù)據(jù)類型

    )和False(假)。4. 列表列表是Python中使用最頻繁的數(shù)據(jù)類型,集合中可以放任何數(shù)據(jù)類型,可對(duì)集合進(jìn)行創(chuàng)建、查找、切片、增加、修改、刪除、循環(huán)和排序操作。5. 元組元組和列表一樣,也是一種
    發(fā)表于 04-19 15:14

    Python元組和字典使用的基本方法

    Python學(xué)習(xí):2、元組、字典使用的基本方法
    發(fā)表于 04-06 15:12

    python——元組,集合,字典

    python——元組,集合,字典(tuple,set,dict)
    發(fā)表于 05-22 12:30

    請(qǐng)問python如何返回元組,列表或字典的?

      Python中的數(shù)據(jù)結(jié)構(gòu)用于存儲(chǔ)數(shù)據(jù)集合,這些數(shù)據(jù)可以從函數(shù)中返回。那么python如何返回元組,列表或字典的?在本文中,我們將探討如何從這些數(shù)據(jù)結(jié)構(gòu)中返回多個(gè)值:元組,列表和字典
    發(fā)表于 07-24 18:42

    python字典

    python字典字典(英文名 dict),它是由一系列的鍵值(key-value)對(duì)組合而成的數(shù)據(jù)結(jié)構(gòu)。字典中的每個(gè)鍵都與一個(gè)值相關(guān)聯(lián),其中鍵,必須是可 hash 的值,如字符串,數(shù)值
    發(fā)表于 02-23 16:54

    python字典高階用法

    通過序列生成字典我們將下面的序列轉(zhuǎn)換為dict類型。lst = [('a', 1), ('b', 2), ('c', 3)]普通的寫法for k, v in lst: dic[k] =
    發(fā)表于 03-29 17:39

    python字典類型的使用和注意事項(xiàng)

    字典類型在實(shí)際的python開發(fā)中,使用特別頻繁,結(jié)合本人多年的工作經(jīng)驗(yàn),現(xiàn)將字典的使用以及字典使用注意事項(xiàng)總結(jié)如下:
    的頭像 發(fā)表于 01-19 17:49 ?3478次閱讀
    <b class='flag-5'>python</b><b class='flag-5'>字典</b><b class='flag-5'>類型</b>的使用和注意事項(xiàng)

    python的列表和元組及字典資料集合免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是python的列表和元組及字典資料集合免費(fèi)下載。
    發(fā)表于 03-16 08:00 ?7次下載

    Python學(xué)習(xí)要點(diǎn):自定義序列實(shí)現(xiàn)切片功能

    基于原生的序列類型(如字符串、列表、元組),那么,我們是否可以定義自己的序列類型并讓它支持切片語法呢?更進(jìn)一步,我們是否可以自定義其它對(duì)象(如字典
    發(fā)表于 11-24 11:51 ?671次閱讀

    python字典是什么

    python字典 字典(英文名 dict),它是由一系列的鍵值(key-value)對(duì)組合而成的數(shù)據(jù)結(jié)構(gòu)。 字典中的每個(gè)鍵都與一個(gè)值相關(guān)聯(lián),其中 鍵,必須是可 hash 的值,如字符串
    的頭像 發(fā)表于 02-23 16:54 ?3418次閱讀

    Python-字典

    dictionary (字典) **是除列表外** Python **中,最靈活的數(shù)據(jù)類型
    的頭像 發(fā)表于 02-16 15:02 ?602次閱讀
    <b class='flag-5'>Python</b>-<b class='flag-5'>字典</b>

    Python基礎(chǔ)語法-字典

    字典Python中一種常見的數(shù)據(jù)類型用于存儲(chǔ)具有映射關(guān)系的數(shù)據(jù)。
    的頭像 發(fā)表于 02-23 14:06 ?976次閱讀
    <b class='flag-5'>Python</b>基礎(chǔ)語法-<b class='flag-5'>字典</b>

    簡(jiǎn)述python字典映射嵌套排序和判斷

    python字典是一種鍵值映射,而不是序列。 字典是通過鍵來存儲(chǔ)對(duì)應(yīng)值。序列是通過索引位置來存儲(chǔ)對(duì)應(yīng)值。
    的頭像 發(fā)表于 02-27 14:52 ?698次閱讀

    Python序列的列表類型介紹

    列表:用于存儲(chǔ)任意數(shù)目、任意類型的數(shù)據(jù)集合。 列表是內(nèi)置可變序列,是包含多個(gè)元素的有序連續(xù)的內(nèi)存空間。 特點(diǎn): 有序, 可變, 中括號(hào)[] 列表的標(biāo)準(zhǔn)語法格式:a = [10,20,30,40
    的頭像 發(fā)表于 03-08 17:27 ?1249次閱讀

    Python序列的元組類型介紹

    介紹 列表屬于可變序列,可以任意修改列表中的元素。 元組屬于不可變序列,不能修改元組中的元素。 元組特點(diǎn): 有序, 不可變, 小括號(hào) ( ) 操作 元組沒有增加元素、修改元素、刪除元素相關(guān)的方法
    的頭像 發(fā)表于 03-08 17:30 ?1020次閱讀