Python基礎數據類型:字典dict 01 內容大綱 字典的初識 字典的使用(增刪改查) 字典的嵌套 02 具體內容 字典的初識: why: 列表可以存儲大量的數據,數據之間的關聯性不強 ['太白', 18, '男', '大壯', 3, '男'] 列表的查詢速度比較慢。 what:容器型數據類型: ...
Python基礎數據類型:字典dict
01 內容大綱
- 字典的初識
- 字典的使用(增刪改查)
- 字典的嵌套
02 具體內容
字典的初識:
why:
- 列表可以存儲大量的數據,數據之間的關聯性不強
- ['太白', 18, '男', '大壯', 3, '男']
- 列表的查詢速度比較慢。
- 列表可以存儲大量的數據,數據之間的關聯性不強
what:容器型數據類型:dict。
how:
數據類型的分類(可變與不可變):
可變(不可哈希)的數據類型:list dict set
不可變(可哈希)的數據類型: str bool int tuple
不可變是指該對象本身是不可變的,在記憶體中自始至終未變化。
比如,對字元串的任何操作,對原對象沒有任何改變。
s = 'alex' s2 = s.upper() print(s,s2)#alex ALEX s = 'alex' s = s.upper() print(s)#ALEX 變化的只是變數的指向
i = 100 i = 101 i = 102 #100,101,102都會在記憶體中占一定空間,變化的只是變數的指向。
字典:{}括起來,以鍵值對形式存儲的容器型數據類型:
dic = {'太白': {'name': '太白金星','age': 18, 'sex': '男'}, 'python22期': ['朱光亞', '大壯', '雪飛', '岑哥'], }
鍵必須是不可變的數據類型:int , str (bool tuple幾乎不用) 鍵要是唯一的
只能通過房間號(鍵)找到房間(值),房間記憶體什麼數據都行
值可以是任意數據類型,對象。
字典3.5x版本之前(包括3.5)是無序的。
字典3.6x會按照初次建立字典的順序排列,學術上不認為是有序的。
字典3.7x以後都是有序的。
字典的優點:查詢速度非常快,存儲關聯性的數據。
字典的缺點:以空間換時間。
字典的創建方式:
面試會考:創建字典的三種方式 #dict查看源碼 Ctrl+左鍵 點擊dict # 方式一: dic = dict((('one', 1), ('two', 2), ('three', 3))) #創建字典用dic = dic() 括弧內包含一個大元組,用括弧括起來, #大元組內部包含三個小元組,分別用3個括弧括起來。用到了元組的拆包 dic = dict([('one',1),('two',2),('three',3)]) print(dic) # {'one': 1, 'two': 2, 'three': 3} # 方式二: dic = dict(one=1, two=2, three=3) print(dic) # 方式三: dic = dict({'one': 1, 'two': 2, 'three': 3}) #官方正規寫法dic = dic() 括弧內放了一個字典 print(dic) dic = {'one': 1, 'two': 2, 'three': 3} #平時上課的寫法 # 方式四: dic = dict(zip(['one', 'two', 'three'],[1, 2, 3])) print(dic)#{'one': 1, 'two': 2, 'three': 3} # 方式五: 字典推導式 後面會講到 dic = { k: v for k,v in [('one', 1),('two', 2),('three', 3)]} print(dic)#{'one': 1, 'two': 2, 'three': 3} # 方式六:利用fromkey -->創建一個字典:字典的所有鍵來自一個可迭代對象,字典的值使用同一個值。 字典的鍵來自於一個可迭代對象(可迭代對象每個元素作為鍵),而值是多個鍵共用一個。 dic = dict.fromkeys('abcd','太白') print(dic)#{'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'} dic = dict.fromkeys([1, 2, 3], 'alex') print(dic)#{1: 'alex', 2: 'alex', 3: 'alex'} 【面試題會考】#坑:如果通過fromkeys得到的字典的 值 為可變的數據類型,那麼你的小心了。 dic = dict.fromkeys([1,2,3],[]) dic[1].append(666) print(dic)#{1: [666], 2: [666], 3: [666]}
驗證字典的合法性:
# 不合法 dic = {[1,2,3]: 'alex', 1: 666} # 鍵要不可變的數據類型 print(dic) #TypeError: unhashable type: 'list' dic = {[1, 2, 3]: '周傑倫'} # list是可變的. 不能作為key。TypeError: unhashable type: 'list' dic = {{1: 2}: "哈哈哈"} # dict是可變的. 不能作為key。TypeError: unhashable type: 'dict' dic = {{1, 2, 3}: '呵呵呵'} # set是可變的, 不能作為key。TypeError: unhashable type: 'set' dic = {1: 'alex', 1: '太白', 2: 'wusir'} # 鍵要唯一,假如有相同的鍵,後面的自動把前面的鍵值對覆蓋 print(dic) #{1: '太白', 2: 'wusir'}
字典的增刪改查【掌握】
dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']} # 增: # 直接增加 有則改之,無則增加 dic['sex'] = '男' #沒有sex這個鍵,就增加鍵值對 print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車'], 'sex': '男'} dic['age'] = 23 # 改 :有age這個鍵,就成了字典的改值 print(dic)#{'name': '太白', 'age': 23, 'hobby_list': ['直男', '鋼管', '開車']} # setdefault 有則不變,無則增加 dic.setdefault('hobby') print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車'], 'hobby': None} #None空 dic.setdefault('hobby', '球類運動')#無則增加:沒有此鍵則添加 print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車'], 'hobby': '球類運動'} dic.setdefault('age', 45)#有則不變:有此鍵則不變 print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']} # 刪 # pop 按照鍵刪除鍵值對, 有返回值,可以設置返回值;設置第二個參數則無論字典中有無此鍵都不會報錯 ***【重點記】 dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']} dic.pop('age') print(dic)#{'name': '太白', 'hobby_list': ['直男', '鋼管', '開車']} ret = dic.pop('age') print(ret) #18 返回刪除鍵對應的值 dic.pop('hobby') #報錯 KeyError: 'hobby' #設置第二個參數則無論字典中有無此鍵都不會報錯 ;pop返回值可以設置 ret = dic.pop('hobby','沒有此鍵') print(ret)#沒有此鍵 ret = dic.pop('hobby','哈哈') print(ret)#哈哈 (返回值) # popitem 3.5版本之前,popitem為隨機刪除,3.6之後為刪除最後一個,有返回值 dic = {'name': '太白', 'age': 18} ret = dic.popitem() print(ret, dic) #('age', 18) {'name': '太白'} # clear 清空字典 ** dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']} dic.clear() #把字典內容清空,不是把字典刪除 print(dic) # del 通過鍵刪除鍵值對 ** dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']} del dic['age'] print(dic)#{'name': '太白', 'hobby_list': ['直男', '鋼管', '開車']} #沒有此鍵會報錯 del dic['age1']#KeyError: 'age1' 報錯 print(dic) # del dic 刪除整個字典 dic = {'name': '太白', 'age': 18} del dic print(dic)# name 'dic' is not defined 因為字典被刪除了 # 改:通過鍵值對直接改 dic['name'] = 'alex' print(dic) # update用法: dic = {'name': '太白', 'age': 18} #增加 dic.update(sex='男',heigth=175) print(dic)#{'name': '太白', 'age': 18, 'sex': '男', 'heigth': 175} #改: dic.update(name='alex') print(dic)#{'name': 'alex', 'age': 18} #【面試會考】 dic = {'name': '太白', 'age': 18} dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')]) #列表中包含多個元組 print(dic) # {'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'} #更新,有則覆蓋,無則添加 dic1 = {"name":"jin","age":18,"sex":"male"} dic2 = {"name":"alex","weight":75} dic2.update(dic1) print(dic2)#{'name': 'jin', 'weight': 75, 'age': 18, 'sex': 'male'} dic1.update(dic2) print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75} # 查 #按鍵查值,缺點:沒有鍵會報錯,不建議用 #通過鍵查詢,直接dic[key](沒有此鍵會報錯) dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']} print(dic['hobby_list']) #['直男', '鋼管', '開車'] print(dic['hobby_list1']) #報錯 KeyError: 'hobby_list1' # get ***【重點記】 #沒有鍵返回None,不會報錯。可以設置返回值 dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']} l1 = dic.get('hobby_list') print(l1) #['直男', '鋼管', '開車'] l1 = dic.get('hobby_list','沒有此鍵') # 可以設置返回值: '沒有此鍵'(返回值) print(l1)#['直男', '鋼管', '開車'] l1 = dic.get('hobby_list1') print(l1) #None 沒有鍵返回None,不會報錯 l1 = dic.get('hobby_list1','沒有此鍵') # 可以設置返回值 print(l1) #沒有此鍵(返回值) # 三個特殊的查 keys() values() items() # keys() # 一個高仿列表,存放的都是字典中的key print(dic.keys(),type(dic.keys())) #dict_keys(['name', 'age', 'hobby_list']) <class 'dict_keys'> # 可以轉化成列表 print(list(dic.keys())) #['name', 'age', 'hobby_list'] #迴圈遍歷,列印鍵: #1 for key in dic.keys(): print(key) #2 for key in dic: print(key) #結果: name age hobby_list # values() dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','鋼管','開車']} #一個高仿列表,存放都是字典中的value print(dic.values())#dict_values(['taibai', 18, ['直男', '鋼管', '開車']]) # 可以轉化成列表 print(list(dic.values()))#['taibai', 18, ['直男', '鋼管', '開車']] #迴圈遍歷,列印值: #1: for value in dic.values(): print(value) #2: for key in dic: print(dic[key]) #結果: taibai 18 ['直男', '鋼管', '開車'] # items() dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','鋼管','開車']} # 一個高仿列表,存放是多個元祖,元祖中第一個是字典中的鍵,第二個是字典中的值 print(dic.items())#dict_items([('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '鋼管', '開車'])]) # 可以轉化成列表 print(list(dic.items())) #[('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '鋼管', '開車'])] #迴圈遍歷,列印所有鍵值對 #1: for key,value in dic.items(): print(key,value) #2: for key in dic: print(key,dic[key]) 結果: name taibai age 18 hobby_list['直男', '鋼管', '開車'] #元組拆包,分別賦值 a,b = ('name', '太白') print(a,b) #面試題:用一行代碼將a和b的值互換 a = 18 b = 12 a,b = b,a print(a,b)#12 18 a,b= 12,18 print(a,b)
字典的嵌套【掌握】
dic = { 'name': '汪峰', 'age': 48, 'wife': [{'name': '國際章', 'age': 38},], 'children': {'girl_first': '小蘋果','girl_second': '小怡','girl_three': '頂頂'} } # # 1. 獲取汪峰的名字。 print(dic['name']) print(dic.get('name')) # # 2.獲取這個字典:{'name':'國際章','age':38}。 print(dic['wife'][0]) #{'name': '國際章', 'age': 38} print(dic.get('wife')[0])#{'name': '國際章', 'age': 38} # # 3. 獲取汪峰妻子的名字。 print(dic.get('wife')[0].get('name'))#國際章 print(dic.get('wife')[0]['name'])#國際章 print(dic['wife'][0]['name'])#國際章 # # 4. 獲取汪峰的第三個孩子名字。 print(dic.get('children').get('girl_three'))#頂頂 print(dic.get('children')['girl_three'])#頂頂 print(dic['children']['girl_three'])#頂頂
迴圈字典,改變字典大小的問題:
在迴圈一個字典的過程中,不要改變字典的大小(增,刪字典的元素),這樣會直接報錯。
dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18} 請將字典中所有鍵帶k元素的鍵值對刪除。
#錯誤做法: for key in dic: if 'k' in key: dic.pop(key) print(dic) #迴圈一個字典時,如果改變這個字典的大小,就會報錯 #自: 把鍵中不含有K元素的鍵值對增加到新的字典中,最後把這個字典賦值給原字典 dic = {'k1': '太白', 'k2': 'barry','k3': '白白', 'age': 18} dic1 = {} for key in dic.keys(): if 'k' not in key: dic1[key] = dic[key] dic = dic1 print(dic)#{'age': 18} 方法:通過迴圈一個列表,去刪除字典 ##講: dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18} l1 = [] for key in dic: if 'k' in key: l1.append(key) print(l1)#['k1', 'k2', 'k3'] for i in l1: #迴圈一個列表,去刪除字典時不會報錯 dic.pop(i) #按照鍵刪除鍵值對 print(dic)#{'age': 18} ###2: dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18} for key in list(dic.keys()): # ['k1', 'k2', 'k3','age'] if 'k' in key: dic.pop(key) print(dic)#{'age': 18}