python字典詳解
- 2020 年 1 月 6 日
- 筆記
字典是Python中唯一的內建的映射類型,可以存儲任意對象的容器,比如:字元串,列表,元組,自定義對象等;字典由鍵(key)與值(value)組成,基本語法如下:
{key:value, … …} 字典中每個Key是唯一的,key必須是可哈希(後面我們介紹);
這節我們來看下字典基本知識點:
1>字典定義、遍歷、修改; 2>理解字典key; 4>字典相關函數;
1.字典定義與訪問
1.1 直接定義字典:
stocks = {'000001':'平安銀行', '000002':'萬科A', '000025':'特力A'} #000001,000002,000025為key;對應的平安銀行,萬科A,特力A為value
1.2 使用dict方法:
dict是Python的字典類,可以使用字典相關方法定義字典,具體如下:
#列表或者元組中每個元素必須為列表或者元組且長度為2 phoneprice = [['小米8青春版',1699], ['華為P20',3188], ['VIVOX23', '2798']] pdict = dict(phoneprice) print(pdict)
1.3 使用fromkeys方法:
方法:dict.fromkeys(iterable, value=None),說明:
1>將可迭代對象轉成字典,字典key為迭代對象每個元素,值為value; 2>iterable必須為可迭代對象,value默認值為None
具體操作如下:
#字元串 kstr = 'abcd' dstr = dict.fromkeys(kstr, 1) print('dstr:',dstr) #列表: klist = ['python','java','C++'] dlist = dict.fromkeys(klist, 0) print(dlist)
這些就是字典初始化常用的方式。
1.4 字典訪問:
1)使用key獲取值:
stocks = {'000001':'平安銀行', '000002':'萬科A', '000025':'特力A'} #通過key訪問對應value print(stocks['000002']) print("stocks[{}]:{}".format('000002', stocks['000002']))
輸出結果:
萬科A stocks[000002]:萬科A
2)遍歷字典: 通過for循環可以獲取字典所有key,具體如下:
stocks = {'000001':'平安銀行', '000002':'萬科A', '000025':'特力A'} #遍歷為字典所有key for key in stocks: print(key)
輸出結果:
000001 000002 000025
可以通過Key獲取對應的Value:
stocks = {'000001':'平安銀行', '000002':'萬科A', '000025':'特力A'} #獲取為字典所有key for key in stocks: print(key, stocks[key])
輸出結果:
000001 平安銀行 000002 萬科A 000025 特力A
1.5 字典修改:
1)直接修改:
#用戶名密碼 userinfo = {'uname':'admin', 'pwd':'admin123'} print(userinfo) #修改密碼 userinfo['pwd'] = 'abcd1234' print(userinfo)
輸出結果:
{'uname': 'admin', 'pwd': 'admin123'} {'uname': 'admin', 'pwd': 'abcd1234'}
2)添加值:
#用戶名密碼 userinfo = {'uname':'admin', 'pwd':'admin123'} print(userinfo) #添加手機號 userinfo['phonenum'] = '15022332233' print(userinfo)
輸出結果:
{'uname': 'admin', 'pwd': 'admin123'} {'uname': 'admin', 'pwd': 'admin123', 'phonenum': '15022332233'}
2 字典Key
1)字典key是唯一的:
#result中有兩個first result = {'first':'zhang','Second':'sun', 'first':'li'} #first對應值? print(result['first'])
輸出結果:li,字典中每個key是唯一的,但是value可以相同;
2)字典key必須是不可改變對象: 我們怎麼來理解key不可改變?數字,字元串,元組都是不可改變對象,他們可以為key,換一個列表試試:
info = {} info[[1,2,3]] = 1
輸出結果:
<ipython-input-36-9ce2e27f396d> in <module> 1 info = {} ----> 2 info[[1,2,3]] = 1 TypeError: unhashable type: 'list'
觸發異常,因為列表是不可hash對象。 所以更好說的說法應該是字典key必須是可以hash對象。不可變的對象才能被hash。 我們可以直接使用hash這個函數看下處理結果:
print(hash('a')) print(hash(1)) print(hash((1,2,3)))
輸出結果:
-99564674986098144 1 2528502973977326415
不同對象的hash值都是唯一的,且hash對象必須是不可改變的。
3)字典key為什麼要hash? 字典添加訪問過程可以簡單理解為下圖(內部實現可能更加複雜):

根據這個簡單示意圖我們知道key必須可以hash的原因,字典這種實現方式能夠很快的找到查找元素。 所以字典的key必須是不可改變的。
4)考驗下,我們是否真的理解了?
info = {1:'one', 1.0:'frist'} info
字典info是什麼值,大家可以在評論區寫出結果。
3.字典常用操作:
1)in:判斷key是否在字典中; 抖音上找了幾個作品,我們來判斷下:
songs= {'虎二':'不僅僅是喜歡', '摩登兄弟':'走馬', '西瓜妹':'花橋流水','M哥':'我的將軍啊'} print('麵筋哥' in songs) print('M哥' in songs)
輸出結果:False,True
2)len:獲取字典長度;
songs= {'虎二':'不僅僅是喜歡', '摩登兄弟':'走馬', '西瓜妹':'花橋流水','M哥':'我的將軍啊'} print(len(songs))
輸出結果:4 3)del:刪除元素;
songs= {'虎二':'不僅僅是喜歡', '摩登兄弟':'走馬', '西瓜妹':'花橋流水','M哥':'我的將軍啊'} #刪除key為虎二的元素 del songs['虎二'] print(songs)
輸出結果:{'摩登兄弟': '走馬', '西瓜妹': '花橋流水', 'M哥': '我的將軍啊'}
4.字典常用方法詳解:
4.1.獲取字典key與元素:
主要方法如下:
方法 |
說明 |
---|---|
D.keys() |
獲取字典所有ley |
D.values() |
獲取字典所有value |
D.items() |
獲取字典所有item |
相關操作如下:
songinfo = {'虎二':'不僅僅是喜歡', '摩登兄弟':'走馬', '西瓜妹':'花橋流水','M哥':'我的將軍啊'} songer = songinfo.keys() print(songer) songs = songinfo.values() print(songs) items = songinfo.items() print(items)
“`輸出結果: dict_keys(['虎二', '摩登兄弟', '西瓜妹', 'M哥']) dict_values(['不僅僅是喜歡', '走馬', '花橋流水', '我的將軍啊']) dict_items([('虎二', '不僅僅是喜歡'), ('摩登兄弟', '走馬'), ('西瓜妹', '花橋流水'), ('M哥', '我的將軍啊')])
遍歷字典幾種方式: ```Python songinfo= {'虎二':'不僅僅是喜歡', '摩登兄弟':'走馬', '西瓜妹':'花橋流水','M哥':'我的將軍啊'} #獲取keys,然後遍歷 #與for key in songs類似 ks = songinfo.keys() for k in ks: print(k, songinfo[k]) print('======') #獲取字典所有items,然後遍歷 for key, value in songinfo.items(): print(key, value)
輸出結果:
虎二 不僅僅是喜歡 摩登兄弟 走馬 西瓜妹 花橋流水 M哥 我的將軍啊 ====== 虎二 不僅僅是喜歡 摩登兄弟 走馬 西瓜妹 花橋流水 M哥 我的將軍啊
4.2 獲取Key對應value
方法 |
說明 |
---|---|
D.get(k[,d]) |
如果k在D中存在,返回D[k],否則返回d,d默認值為None |
D.setdefault(k[,d]) |
如果k在D中存在,返回D[k],否則D[k]=d |
具體操作如下:
userinfo= {'uname':'lucy', 'pwd':'aabbcc'} print(userinfo) #獲取用戶名 print('{}:{}'.format('uname',userinfo.get('uname'))) #獲取用戶年齡 print('{}:{}'.format('age',userinfo.get('age'))) #如果密碼不存在,設置默認密碼,否則返回存在密碼 print('{}:{}'.format('pwd',userinfo.setdefault('pwd', '123456'))) #如果用戶年齡不存在,設置默認值 print('{}:{}'.format('age',userinfo.setdefault('age', 1))) #設置之後,查看字典內容: print(userinfo)
輸出結果:
{'uname': 'lucy', 'pwd': 'aabbcc'} uname:lucy age:None pwd:aabbcc age:1 {'uname': 'lucy', 'pwd': 'aabbcc', 'age': 1}
4.3 字典刪除
方法 |
說明 |
---|---|
D.pop(k[,d]) |
詳細解釋看錶格下方 |
D.popitem() |
刪除並返回一對key-value,字典為空報錯 |
D.clear() |
刪除字典所有元素 |
D.pop(k[,d]) 詳解:
1>k為刪除鍵,d為給定返回值; 2>若k存在,刪除k並返回k對應value; 3>若k不存在,且d有值,返回d; 4>若k不存在,且沒有給定d,觸發異常;
1)使用pop刪除:
#數字貨幣價格:瑞波幣,以太坊,比特幣 BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'} print(BiPrice) #刪除瑞波幣 print('XRP price:',BiPrice.pop('XRP')) #刪除後結果: print('刪除後結果:', BiPrice) #刪除EOS,如果不存在,返回2$ print('EOS price:',BiPrice.pop('EOS', '$2'))
輸出結果:
{'XRP': '$0.36557', 'ETH': '$113.60', 'BTC': '$ 4031.6'} XRP price: $0.36557 刪除後結果: {'ETH': '$113.60', 'BTC': '$ 4031.6'} EOS price: $2
刪除不存在key:
#數字貨幣價格:瑞波幣,以太坊,比特幣 BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'} BiPrice.pop('BCH')
運行結果:
KeyError Traceback (most recent call last) <ipython-input-77-2507cf08400a> in <module> 1 #數字貨幣價格:瑞波幣,以太坊,比特幣 2 BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'} ----> 3 BiPrice.pop('BCH') KeyError: 'BCH'
刪除不存在元素,報錯。 2)使用popitem刪除:
#數字貨幣價格:瑞波幣,以太坊,比特幣 BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'} print(BiPrice) print('popitem:',BiPrice.popitem()) print('刪除後結果:', BiPrice)
輸出結果:
{'XRP': '$0.36557', 'ETH': '$113.60', 'BTC': '$ 4031.6'} popitem: ('BTC', '$ 4031.6') 刪除後結果: {'XRP': '$0.36557', 'ETH': '$113.60'}
3)使用clear清空字典:
BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'} print(BiPrice) BiPrice.clear() print('clear後結果:', BiPrice)
運行結果:
{'XRP': '$0.36557', 'ETH': '$113.60', 'BTC': '$ 4031.6'} clear後結果: {}
4.4 字典更新方法:
方法 |
說明 |
---|---|
D.update([E, ]**F) |
更新字典 ,E為Key-value可迭代對象或者字典 |
我們來分析這個方法:
1>如果E為字典,for k in E: D[k] = E[k]; 2>如果E為可迭代對象,for k, v in E: D[k] = v; 3>如果**F,for k in F: D[k] = F[k];(**F為可變長關鍵字參數))
相關操作如下:
#一局王者榮耀5V5,某方英雄選擇最開始兩個: heros = {'白起':'上路','嬴政':'中路'} #添加射手: heros.update({'劉備':'射手'}) print('增加劉備:',heros) #添加夏侯惇與鬼谷子 heros.update([('夏侯惇', '上路'), ('鬼谷子', '輔助')]) print('增加兩個:', heros) #更改夏侯惇分路 heros.update([('夏侯惇', '打野')]) print('更改屬性:', heros)
輸出結果:
增加劉備: {'白起': '上路', '嬴政': '中路', '劉備': '射手'} 增加兩個: {'白起': '上路', '嬴政': '中路', '劉備': '射手', '夏侯惇': '上路', '鬼谷子': '輔助'} 更改屬性: {'白起': '上路', '嬴政': '中路', '劉備': '射手', '夏侯惇': '打野', '鬼谷子': '輔助'}
到這裡我們對字典就有了基本認識,可以使用字典來解決工作和學習中的問題。