八、字典
? 字典是Python唯一的映射型別,以鍵值對(key - value)的方式進行存盤
1、創建字典
? 字典可以使用多種形式進行創建,在訪問時也是像串列一樣通過中括號進行索引,不過不是通過下標而是通過鍵來進行訪問,
? 下面對一部分字典創建方法進行列舉
(1) 通過花括號創建
? 字典可以通過花括號創建,每個鍵值對的形式為<鍵 : 值>
dict1 = {'Harry':'ExpelliArmus', 'Ron':'Bloody hell', 'Naruto':'Rasengan', 'August':'???'}
print('Ron said:', dict1['Ron'])
輸出結果:Ron said: Bloody hell
(2) 使用關鍵詞引數和型別建構式
dict2 = dict(name = 'August', gender = 'male') #每個“值”前面的“鍵”為關鍵字引數,不是字串
print(dict2)
輸出結果:{'name': 'August', 'gender': 'male'}
(3) 使用型別建構式和zip()方法
keys = ['1', '2', '3', '4']
values = ['one', 'two', 'three', 'four']
dict3 = dict(zip(keys, values))
print(dict3)
輸出結果:{'1': 'one', '2': 'two', '3': 'three', '4': 'four'}
(4) 按欄位分開填寫
dict4 = {} #創建空字典
dict4['name'] = 'FWTY'
dict4['nickName'] = 'August'
dict4['age'] = '23'
print(dict4)
輸出結果:{'name': 'FWTY', 'nickName': 'August', 'age': '23'}
(5) fromkeys()
fromkeys()方法的作用也是建立新的字典
fromkeys()方法并不是對字典本身進行操作而是創建一個新字典,所以需要將創造出的字典賦值給一個變數
fromkeys(<keys> [,<values>]) #velues不提供的話默認為None
dict5 = dict.fromkeys((1, 2, 3)) #引數values為空
print(dict5)
輸出結果:{1: None, 2: None, 3: None}
========================================================
dict5 = dict.fromkeys((1, 2, 3), 'Numbers')
print(dict5)
輸出結果:{1: 'Numbers', 2: 'Numbers', 3: 'Numbers'}
? 注意,第二個引數會被fromkeys()方法當做一個整體處理
dict5 = dict.fromkeys((1, 2, 3), ('one', 'two', 'three'))
print(dict15
輸出結果:{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
'''由于是當作一個整體處理,所以并不會將元組中的每一個元素作為不同的值分別對應到每一個鍵,而是將元組整體作為一個值'''
2、訪問字典
(1) keys()
keys()方法的作用是回傳字典的鍵
dict1 = dict.fromkeys(('A', 'B', 'C', 'D'), 'Letters')
for eachKey in dict1.keys():
print(eachKey)
輸出結果: A
B
C
D
(2) values()
values()方法的作用是回傳字典的值
keys = ['1', '2', '3', '4']
values = ['one', 'two', 'three', 'four']
dict2 = dict(zip(keys, values))
for eachValue in dict2.values():
print(eachValue)
輸出結果:one
two
three
four
(3) items()
items()方法的作用是回傳字典的項(鍵值對)
keys = ['1', '2', '3', '4']
values = ['one', 'two', 'three', 'four']
dict2 = dict(zip(keys, values))
for eachItem in dict2.items():
print(eachItem)
輸出結果:('1', 'one')
('2', 'two')
('3', 'three')
('4', 'four')
(4) get()
get()方法是一個更為寬松的訪問字典項的方法,當我們直接使用鍵來索引時,如果訪問的是一個不存在的鍵,那么程式將會報錯,如:
dict3 = dict.fromkeys((1, 2, 3), 'Numbers')
print(dict3[4])
輸出結果:KeyError: 4
? 但當我們使用get()方法時,訪問不存在的鍵并不會報錯,
get(<鍵>[, <當鍵不存在時的回傳值>]) #第二個引數可選,不填時默認回傳None
dict3 = dict.fromkeys((1, 2, 3), 'Numbers')
print(dict3.get(4))
輸出結果:None
================================================
print(dict3.get(4, 'Dont Exist'))
輸出結果:Dont Exist
3、常用方法
(1) clear()
clear()方法的作用是清空字典
dict1.clear()
print(dict1)
輸出結果:{}
(2) copy()
copy()方法是淺拷貝
淺拷貝只復制指向某個物件的指標,而不復制物件本身,新舊物件還是共享同一塊記憶體,但深拷貝會另外創造一個一模一樣的物件,新物件跟原物件不共享記憶體,修改新物件不會改動原物件,
如果拷貝的物件里的元素只有值,沒有參考,那淺拷貝和深拷貝沒有差別,都會將原有物件復制一份,產生一個新物件,對新物件里的值進行修改不會影響原有物件,新物件和原物件完全分離開,
如果拷貝的物件里的元素包含參考(像一個串列里儲存著另一個串列,存的就是另一個串列的參考),那淺拷貝和深拷貝是不同的,淺拷貝雖然將原有物件復制一份,但是依然保存的是參考,所以對新物件里的參考里的值進行修改,依然會改變原物件里的串列的值,新物件和原物件完全分離開并沒有完全分離開,而深拷貝則不同,它會將原物件里的參考也新創建一個,即新建一個串列,然后放的是新串列的參考,這樣就可以將新物件和原物件完全分離開,
而直接賦值,則是相當于物件的參考
? 簡單舉例:
? a = {1 : '123'}
b=a直接賦值 a, b指向同一個物件

b = a.copy()淺拷貝 a, b是獨立的兩個物件,但他們的子物件還指向同一物件(是同一物件的參考)

b = copy.deepcopy(a)深拷貝 b完全拷貝了a的父物件及其子物件,兩者完全獨立

(3) pop() / popitem()
pop()方法的作用是彈出一個字典項并回傳這一項的值
dict2 = {1:'one', 2:'two', 3:'three', 4:'four'}
print(dict2.pop(2))
print(dict2)
輸出結果:two #回傳鍵為2的字典項的值
{1: 'one', 3: 'three', 4: 'four'}
? popitem()方法的作用為彈出最后一個字典項并回傳
dict2 = {1:'one', 2:'two', 3:'three', 4:'four'}
print(dict2.popitem())
print(dict2)
輸出結果:(4, 'four')
{1: 'one', 2: 'two', 3: 'three'}
(4) setdefault()
setdefault()方法的作用是根據鍵查找對應值,若查詢的鍵不存在則將其添加進字典中
setdefault(<鍵>[, <值>]) #若不規定值則在添加時,加入的鍵對應值為None
dict2 = {1:'one', 2:'two', 3:'three', 4:'four'}
print(dict2.setdefault(1))
print(dict2.setdefault(5))
print(dict2.setdefault(6, 'six'))
print(dict2)
輸出結果:one #查詢的鍵值對存在
None #未設定值對應引數
six #設定了值對應引數
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None, 6: 'six'}
(5) update
update()方法的作用是利用一個字典(或映射關系)去更新字典
dict2 = {1:'one', 2:'two', 3:'three', 4:'four'}
dict3 = {4:'肆'}
dict2.update(dict3)
print(dict2)
輸出結果:{1: 'one', 2: 'two', 3: 'three', 4: '肆'}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/170371.html
標籤:Python
下一篇:實體007:copy
