筆者:風起怨江南 出處:https://blog.csdn.net/JackMengJin 筆者原創,文章歡迎轉載,如果喜歡請點贊+關注,感謝支持!
上一篇《Python學習08》爲字典基礎部分,傳送門 -> Python學習09揭開字典的神祕面紗
這一篇主要講字典的嵌套和字典的常用函數等內容。
目錄
2.6 items() 函數、keys() 函數、values()函數
字典的嵌套和常用函數
一、字典的嵌套
在字典嵌套的大前提,必須要弄清楚:
- 字典裏的key不能重複
- 字典裏的key必須是不可變的數據類型:比如數字、字符串、元組等
1.1 列表嵌套字典
先來個例子開個場,用列表去存儲每一個字典,字典裏存儲每個人個人信息:
list = [
{'姓名':'Jack','性別':'男','年齡':'18','身高':'160','體重':'110','愛好':'python'},
{'姓名':'Mary','性別':'女','年齡':'20','身高':'145','體重':'160','愛好':'rap'},
{'姓名':'James','性別':'男','年齡':'35','身高':'178','體重':'115','愛好':'read'},
{'姓名':'Kobe','性別':'男','年齡':'14','身高':'203','體重':'130','愛好':'cook'},
{'姓名':'Carter','性別':'男','年齡':'32','身高':'215','體重':'142','愛好':'football'},
{'姓名':'Cat','性別':'男','年齡':'64','身高':'180','體重':'135','愛好':'book'},
{'姓名':'Mark','性別':'男','年齡':'27','身高':'103','體重':'180','愛好':'eat'},
{'姓名':'Amy','性別':'女','年齡':'6','身高':'110','體重':'170','愛好':'swim'},
]
for i in list:
print(i)
可以看到這裏我用了列表和字典做了一個嵌套,外面是列表,而列表裏每一個元素是字典。
我們怎麼去獲取到列表裏每一個元素(字典)呢?通過for循環遍歷:
for i in list:
print(i)
{'姓名': 'Jack', '性別': '男', '年齡': '18', '身高': '160', '體重': '110', '愛好': 'python'}
{'姓名': 'Mary', '性別': '女', '年齡': '20', '身高': '145', '體重': '160', '愛好': 'rap'}
{'姓名': 'James', '性別': '男', '年齡': '35', '身高': '178', '體重': '115', '愛好': 'read'}
{'姓名': 'Kobe', '性別': '男', '年齡': '14', '身高': '203', '體重': '130', '愛好': 'cook'}
{'姓名': 'Carter', '性別': '男', '年齡': '32', '身高': '215', '體重': '142', '愛好': 'football'}
{'姓名': 'Cat', '性別': '男', '年齡': '64', '身高': '180', '體重': '135', '愛好': 'book'}
{'姓名': 'Mark', '性別': '男', '年齡': '27', '身高': '103', '體重': '180', '愛好': 'eat'}
{'姓名': 'Amy', '性別': '女', '年齡': '6', '身高': '110', '體重': '170', '愛好': 'swim'}
可以看到列表裏的元素可以通過for循環遍歷打印出來。
那麼如何再去獲取字典裏的每一個key或每一個value,甚至獲取全部呢?
還是通過for循環遍歷去獲取,獲取字典的key:
for i in range(len(list)):
for j in list[i]:
print(j)
姓名
性別
年齡
身高
體重
愛好
姓名
性別
年齡
身高
體重
愛好
姓名
性別
年齡
身高
體重
愛好
姓名
性別
年齡
身高
體重
愛好
姓名
性別
年齡
身高
體重
愛好
姓名
性別
年齡
身高
體重
愛好
姓名
性別
年齡
身高
體重
愛好
姓名
性別
年齡
身高
體重
愛好
獲取字典的value:
Jack
男
18
160
110
python
Mary
女
20
145
160
rap
James
男
35
178
115
read
Kobe
男
14
203
130
cook
Carter
男
32
215
142
football
Cat
男
64
180
135
book
Mark
男
27
103
180
eat
Amy
女
6
110
170
swim
獲取字典裏每個鍵值對:
for i in range(len(list)):
for j in list[i].items():
print(j)
這裏我們可以看到獲取到的鍵值對是元組數據類型。
('姓名', 'Jack')
('性別', '男')
('年齡', '18')
('身高', '160')
('體重', '110')
('愛好', 'python')
('姓名', 'Mary')
('性別', '女')
('年齡', '20')
('身高', '145')
('體重', '160')
('愛好', 'rap')
('姓名', 'James')
('性別', '男')
('年齡', '35')
('身高', '178')
('體重', '115')
('愛好', 'read')
('姓名', 'Kobe')
('性別', '男')
('年齡', '14')
('身高', '203')
('體重', '130')
('愛好', 'cook')
('姓名', 'Carter')
('性別', '男')
('年齡', '32')
('身高', '215')
('體重', '142')
('愛好', 'football')
('姓名', 'Cat')
('性別', '男')
('年齡', '64')
('身高', '180')
('體重', '135')
('愛好', 'book')
('姓名', 'Mark')
('性別', '男')
('年齡', '27')
('身高', '103')
('體重', '180')
('愛好', 'eat')
('姓名', 'Amy')
('性別', '女')
('年齡', '6')
('身高', '110')
('體重', '170')
('愛好', 'swim')
如果我們只想獲取到key和value,那麼就可以改爲:
for i in range(len(list)):
for k,v in list[i].items():
print(k,v)
姓名 Jack
性別 男
年齡 18
身高 160
體重 110
愛好 python
姓名 Mary
性別 女
年齡 20
身高 145
體重 160
愛好 rap
姓名 James
性別 男
年齡 35
身高 178
體重 115
愛好 read
姓名 Kobe
性別 男
年齡 14
身高 203
體重 130
愛好 cook
姓名 Carter
性別 男
年齡 32
身高 215
體重 142
愛好 football
姓名 Cat
性別 男
年齡 64
身高 180
體重 135
愛好 book
姓名 Mark
性別 男
年齡 27
身高 103
體重 180
愛好 eat
姓名 Amy
性別 女
年齡 6
身高 110
體重 170
愛好 swim
總結一下,這一部分的知識點:
for i in range(len(list)):
for j in list[i]:
print(j)
range(len(list))代表列表的長度,用for可以循環遍歷列表裏每個元素;
裏面的for循環的j代表列表裏具體的元素,而list[i]這裏表示字典裏的key;
如果想獲取到每個元素的值,那麼需要在後面加values();
如果想獲取整個鍵值對,在後面加items()。
那麼如何在字典裏嵌套列表或字典呢?同樣的道理。
1.2 字典嵌套列表
字典嵌套列表:字符串作爲key,列表作爲value。
#字典嵌套列表
dict = {
'個人信息1':['姓名:Jack','性別:男','年齡:18','身高:160','體重:110','愛好:python'],
'個人信息2':['姓名:Mary','性別:女','年齡:20','身高:145','體重:160','愛好:rap'],
'個人信息3':['姓名:James','性別:男','年齡:35','身高:178','體重:115','愛好:read'],
}
for k,v in dict.items():
print('\n',k,end=':')
for x in v:
print(x,end=' ')
打印輸出看一下效果:
個人信息1:姓名:Jack 性別:男 年齡:18 身高:160 體重:110 愛好:python
個人信息2:姓名:Mary 性別:女 年齡:20 身高:145 體重:160 愛好:rap
個人信息3:姓名:James 性別:男 年齡:35 身高:178 體重:115 愛好:read
分析一下:
外面的for循環的k,v分別代表字典dict裏的key和value,而key是字符串,value是列表;
第二個for循環的x表示value裏的元素,也就是列表裏每一個元素,通過for循環遍歷打印出來。
這裏需要注意的是,我用了end=' '參數,這裏是爲了實現print()輸出不換行。
1.3 字典嵌套字典
字典嵌套字典:字符串作爲key,字典作爲value:
#字典嵌套字典
dict = {
'Jack的個人信息':{'性別':'男','年齡':'18','身高':'160','體重':'110','愛好':'python'},
'Mary的個人信息':{'性別':'女','年齡':'20','身高':'145','體重':'160','愛好':'rap'},
'James的個人信息':{'性別':'男','年齡':'35','身高':'178','體重':'115','愛好':'read'},
'Kobe的個人信息':{'性別':'男','年齡':'14','身高':'203','體重':'130','愛好':'cook'},
'Carter的個人信息':{'性別':'男','年齡':'32','身高':'215','體重':'142','愛好':'football'},
'Cat的個人信息':{'性別':'男','年齡':'64','身高':'180','體重':'135','愛好':'book'},
'Mark的個人信息':{'性別':'男','年齡':'27','身高':'103','體重':'180','愛好':'eat'},
'Amy的個人信息':{'性別':'女','年齡':'6','身高':'110','體重':'170','愛好':'swim'},
}
#for遍歷
for k,v in dict.items():
print('\n',k,end=': ')
for x,y in v.items():
print(x,y,end=' ')
Jack: 性別 男 年齡 18 身高 160 體重 110 愛好 python
Mary: 性別 女 年齡 20 身高 145 體重 160 愛好 rap
James: 性別 男 年齡 35 身高 178 體重 115 愛好 read
Kobe: 性別 男 年齡 14 身高 203 體重 130 愛好 cook
Carter: 性別 男 年齡 32 身高 215 體重 142 愛好 football
Cat: 性別 男 年齡 64 身高 180 體重 135 愛好 book
Mark: 性別 男 年齡 27 身高 103 體重 180 愛好 eat
Amy: 性別 女 年齡 6 身高 110 體重 170 愛好 swim
和前面幾個例子道理一樣:
第一個for循環裏k,v分別代表字典裏的key和value,key是字符串,value還是字典;
而第二個for循環裏x,y就代表了value字典裏的key和value。
那麼列表和字典的嵌套什麼時候用呢?
比如希望存儲年級前100名學生的各科成績時,由於學生是由成績進行排名的,列表是有序的數據類型,而字典是無序的數據類型,所以外面會用列表去存儲所有的數據。
而對於學生的各科成績來說,看重的不是有序,而是需要科目和成績一一對應,這纔是最重要的。或者說當我想獲取到年紀第十名同學的語文成績,那麼直接可以直接去獲取到列表對應的索引,和字典裏對應的key就可以了,這樣就能得到相應的value。
比如我想獲取amy的身高:
#字典的嵌套
list = [
{'姓名':'Jack','性別':'男','年齡':'18','身高':'160','體重':'110','愛好':'python'},
{'姓名':'Mary','性別':'女','年齡':'20','身高':'145','體重':'160','愛好':'rap'},
{'姓名':'James','性別':'男','年齡':'35','身高':'178','體重':'115','愛好':'read'},
{'姓名':'Kobe','性別':'男','年齡':'14','身高':'203','體重':'130','愛好':'cook'},
{'姓名':'Carter','性別':'男','年齡':'32','身高':'215','體重':'142','愛好':'football'},
{'姓名':'Cat','性別':'男','年齡':'64','身高':'180','體重':'135','愛好':'book'},
{'姓名':'Mark','性別':'男','年齡':'27','身高':'103','體重':'180','愛好':'eat'},
{'姓名':'Amy','性別':'女','年齡':'6','身高':'110','體重':'170','愛好':'swim'},
]
print(type(list))
print(type(list[-1]))
print(type(list[-1]['身高']))
print(list[-1]['身高'])
<class 'list'>
<class 'dict'>
<class 'str'>
110
可以看到list[-1]獲取到的就是列表對應索引的元素,也就是字典{'姓名':'Amy','性別':'女','年齡':'6','身高':'110','體重':'170','愛好':'swim'};直接去打印字典裏的key,就能獲取到字典的value。
至於其他嵌套的用法,會在之後具體的項目裏再詳細說明。
二、字典的常用函數
2.1 fromkeys() 函數
python裏fromkeys() 函數用於創建一個新字典,以序列 seq 中元素做字典的鍵,value 爲字典所有鍵對應的初始值。
fromkeys()語法:
dict.fromkeys(seq[, value])
- seq -- 字典鍵值列表。
- value -- 可選參數, 設置鍵序列(seq)的值。
返回值:
舉個例子更清楚:
#字典的函數
dict_new = {}
print('打印字典:',dict_new)
seq = ('1','2','3','4','5')
dict_new.fromkeys(seq,'20')
print('打印字典:',dict_new)
打印字典: {}
打印字典: {}
咦?打印出來怎麼是空的字典?爲什麼dict_new裏什麼都沒有?
這裏需要注意的是,fromkeys() 函數用於創建一個新字典,這裏dict_new.fromkeys(seq,'20')就已經是新字典,而不是在原dict_new字典裏添加鍵和值。所以如果想用dict_new去接收新字典,還需要給dict_new賦值dict_new.fromkeys(seq,'20')才行。
#字典的函數
dict_new = {}
print('打印字典:',dict_new)
seq = ('1','2','3','4','5')
dict_new.fromkeys(seq,'20')
print('打印字典:',dict_new)
print('打印字典:',dict_new.fromkeys(seq,'20'))
dict_new = dict_new.fromkeys(seq,'20')
print('打印字典:',dict_new)
打印字典: {}
打印字典: {}
打印字典: {'1': '20', '2': '20', '3': '20', '4': '20', '5': '20'}
打印字典: {'1': '20', '2': '20', '3': '20', '4': '20', '5': '20'}
同樣需要注意,seq這裏必須是不可變數據類型才行,這裏需要注意。
2.2 copy() 函數
copy() 函數返回一個字典的淺複製,而賦值和淺賦值還有深複製這裏不延展講,之後會另出講解。
clear()語法:
dict.copy()
返回值:
返回一個字典的淺複製。
#copy()
dict_demo = {'大佬':'我','菜鳥':'小明'}
print(dict_demo)
dict_demo1 = dict_demo.copy()
print(dict_demo1)
{'大佬': '我', '菜鳥': '小明'}
{'大佬': '我', '菜鳥': '小明'}
2.3 clear()函數
clear() 函數用於刪除字典內所有元素。
clear()語法:
dict.clear()
返回值:
該函數沒有任何返回值。
#clear()
dict_demo = {'大佬':'我','菜鳥':'小明'}
print(dict_demo)
dict_demo.clear()
print(dict_demo)
{'大佬': '我', '菜鳥': '小明'}
{}
2.4 get() 函數
get() 函數返回指定鍵的值,如果值不在字典中返回默認值。
get()語法:
dict.get(key, default=None)
返回值:
返回指定鍵的值,如果值不在字典中返回默認值None。
#get()
dict_demo = {'大佬':'我','菜鳥':'小明'}
print(dict_demo)
print(dict_demo.get('大佬'))
print(dict_demo.get('大哥'))
{'大佬': '我', '菜鳥': '小明'}
我
None
2.5 __contains__函數
python3版本中用__contains__函數代替has_key() 函數,用於判斷鍵是否存在於字典中,如果鍵在字典dict裏返回true,否則返回false。
__contains__語法:
dict.__contains__(key)
返回值:
如果鍵在字典裏返回true,否則返回false。
#__contains__
dict_demo = {'大佬':'我','菜鳥':'小明'}
print(dict_demo.__contains__('大佬'))
True
2.6 items() 函數、keys() 函數、values()函數
items() 函數以列表返回可遍歷的(鍵, 值) 元組數組。其實就是把字典中每對鍵值對組成一個元組,並把這些元組放在列表中返回。
相對應的,keys() 函數以列表返回一個字典所有的鍵,values()函數以列表返回一個字典所有的值。
item()語法:
dict.items()
keys() 語法:
dict.keys()
values()語法:
dict.values()
item()返回值:
返回可遍歷的(鍵, 值) 元組數組。
keys() 返回值:
返回一個字典所有的鍵。
values()返回值:
返回一個字典所有的值。
dict_demo = {'大佬':'我','菜鳥':'小明'}
print(dict_demo.items())
print(dict_demo.keys())
print(dict_demo.values())
dict_items([('大佬', '我'), ('菜鳥', '小明')])
dict_keys(['大佬', '菜鳥'])
dict_values(['我', '小明'])
2.7 update() 函數
update() 函數把字典dict2的鍵/值對更新到dict裏。
update() 語法:
dict.update(dict2)
返回值:
沒有任何返回值。
如果沒有相同的key時:
#update
dict_demo = {'大佬':'我','菜鳥':'小明'}
dict_demo1 = {'高手':'傑克','大神':'小豬'}
print(dict_demo)
print(dict_demo1)
dict_demo1.update(dict_demo)
print(dict_demo1)
{'大佬': '我', '菜鳥': '小明'}
{'高手': '傑克', '大神': '小豬'}
{'高手': '傑克', '大神': '小豬', '大佬': '我', '菜鳥': '小明'}
如果有相同的key時會怎麼處理呢?
#update
dict_demo = {'大佬':'我','菜鳥':'小明'}
dict_demo1 = {'大佬':'傑克','大神':'小豬'}
print(dict_demo)
print(dict_demo1)
dict_demo1.update(dict_demo)
print(dict_demo1)
可以看到有相同的鍵會直接替換成update的值:
{'大佬': '我', '菜鳥': '小明'}
{'大佬': '傑克', '大神': '小豬'}
{'大佬': '我', '大神': '小豬', '菜鳥': '小明'}
其他更多的字典函數,會在之後具體項目中的使用再詳細講解。
以上便是《Python學習08講——Python學習09:字典的嵌套和常用函數》的所有內容,更多python學習請繼續關注我的博客——風起怨江南(傳送門),不定期更新,原創不易,如果喜歡請點贊和關注,謝謝大家的支持!
想獲得免費的學習資料請添加微信公衆號——風起怨江南,非常感謝大家的關注和支持!