你們好,今天是大年初二,身在國外沒有過年的氛圍,只能踏實寫寫文章,對社區作點貢獻,在此祝你們新年快樂!上一期爲你們梳理了一些List的進階用法,今天咱們來看字典Dict的相關技巧,我我的在編程中對字典的使用很是頻繁,其實對於不是很是大的數據存儲需求,字典是一個不錯的選擇,比List要快的多,我在基礎篇裏面講過了一些關於dict的基礎方法,若是沒有看過的朋友們能夠點擊連接Python 基礎起步 (八) 字典實用技巧大全 ,好啦,閒話少說,如今讓咱們一塊兒來看看今天的進階技巧吧~python
建立字典
這裏介紹最多見的幾種方式,直接上例子:編程
first = {} # 建立空字典 second = dict() # 建立空字典 keys = ['Name','Age','Job','Salary'] values = ['White',50,'cook',10000] third=dict(zip(keys,values)) # Zip建立 fouth = dict(Name='White',Age=50,Job='cook',Salary=10000) # 等號建立 fifth = {1: {'name': 'John', 'age': '27', 'sex': 'Male'}, 2: {'name': 'Marie', 'age': '22', 'sex': 'Female'}} # 建立一個嵌套字典 print(first) print(second) print(third) print(fouth) print(fifth[1]) Out: {} {} {'Name': 'White', 'Age': 50, 'Job': 'cook', 'Salary': 10000} {'Name': 'White', 'Age': 50, 'Job': 'cook', 'Salary': 10000} {'name': 'John', 'age': '27', 'sex': 'Male'}
這裏咱們能夠直接用{}或者dict()建立空的字典,或者直接爲字典以key:value的形式賦值,Zip和等號直接賦值也很方便,若是須要多層nested也能夠很簡單的實現,有關建立就說這麼多啦json
字典排序
有關字典排序,咱們有兩種選擇,第一是根據字典的key值排序,第二是根據Value值排序,讓咱們一個個來看,首先讓咱們新建一個字典用於測試:segmentfault
final_result= dict(Math=80,Chinese=78,English=96,Science=60,Art=75) print(final_result.items()) Out: dict_items([('Math', 80), ('Chinese', 78), ('English', 96), ('Science', 60), ('Art', 75)])
這裏咱們建立一個字典final_result,key值是科目的名字,value值是分數,首先根據Key值進行排序,首先讓咱們根據Key值升序,可選的方法不少,好比sorted, operator, lamba :微信
print(sorted(final_result.items())) # 根據key的值升序 Out:[('Art', 75), ('Chinese', 78), ('English', 96), ('Math', 80), ('Science', 60)]
import operator print(sorted(final_result.items(),key=operator.itemgetter(0))) Out:[('Art', 75), ('Chinese', 78), ('English', 96), ('Math', 80), ('Science', 60)]
print(sorted(final_result.items(),key=lambda x:x[0])) Out:[('Art', 75), ('Chinese', 78), ('English', 96), ('Math', 80), ('Science', 60)]
根據key值降序只要加個reverse=True就行了,由於sorted函數默認reverse=False,看下結果:app
print(sorted(final_result.items(),reverse=True)) # 根據key的值降序 Out:[('Science', 60), ('Math', 80), ('English', 96), ('Chinese', 78), ('Art', 75)]
import operator print(sorted(final_result.items(),key=operator.itemgetter(0),reverse=True)) Out:[('Science', 60), ('Math', 80), ('English', 96), ('Chinese', 78), ('Art', 75)]
print(sorted(final_result.items(),key=lambda x:x[0],reverse=True)) Out:[('Science', 60), ('Math', 80), ('English', 96), ('Chinese', 78), ('Art', 75)]
有關lamba函數實在有太多能夠總結的,我會在以後專門拿一期來說,和filter reduce簡直是神器,當我逐漸使用的多了後終於感覺到了一點點pythonic的感受,哈哈函數
其實你們看到了根據key的排序,也猜到了如何根據value 排序,讓咱們先看升序:測試
print(sorted(final_result.items(),key=lambda x:x[1])) #根據Value升序 Out:[('Science', 60), ('Art', 75), ('Chinese', 78), ('Math', 80), ('English', 96)]
import operator print(sorted(final_result.items(),key=operator.itemgetter(1))) Out:[('Science', 60), ('Art', 75), ('Chinese', 78), ('Math', 80), ('English', 96)]
降序也同樣,無非就是加上reverse=True,這裏不一一舉例了:優化
print(sorted(final_result.items(),key=lambda v:v[1],reverse=True)) Out:[('English', 96), ('Math', 80), ('Chinese', 78), ('Art', 75), ('Science', 60)]
字典合併(Merge)
在Python 3.5以上能夠直接用**,是一個經常使用的小技巧,在此對於2.7的用戶說一聲對不起,技術一直說是喜新厭舊呀,讓咱們看一個小栗子:spa
def Merge(dict1, dict2): res = {**dict1, **dict2} return res dict1 = {'a': 10, 'b': 8,'c':2} dict2 = {'d': 6, 'c': 4} dict3 = Merge(dict1, dict2) print(dict3) Out:{'a': 10, 'b': 8, 'c': 4, 'd': 6}
這裏順序很重要,你們必定要看好是誰覆蓋了誰,若是咱們交換一下順序就會變成這樣:
def Merge(dict1, dict2): res = {**dict2, **dict1} # 交換了順序 return res dict1 = {'a': 10, 'b': 8,'c':2} dict2 = {'d': 6, 'c': 4} dict3 = Merge(dict1, dict2) print(dict3) Out:{'d': 6, 'c': 2, 'a': 10, 'b': 8}
對於Python2的朋友們不用擔憂,天然有解決方案,那就是用update函數,也很方便,上代碼:
dict1 = {'a': 10, 'b': 8,'c':2} dict2 = {'d': 6, 'c': 4} dict2.update(dict1) print(dict2) Out:{'d': 6, 'c': 2, 'a': 10, 'b': 8}
利用Json.dumps()美化輸出dict
咱們若是碰到如下這種狀況的dict,若是按照常規print輸出會這樣:
my_mapping = {'a': 23, 'b': 42, 'c': 0xc0ffee} print(my_mapping) Out:{'a': 23, 'b': 42, 'c': 12648430}
可是若是咱們能引用json庫裏的dumps方法會獲得好的多的效果:
import json print(json.dumps(my_mapping, indent=4, sort_keys=True)) Out:{ "a": 23, "b": 42, "c": 12648430 }
字典參數解包
Python裏面方便神奇的方法不少,好比下面這個,能夠實現解包字典:
def unpack(k1,k2,k3): print(k1,k2,k3) my_dict = {'k1':'value1','k2':'value2','k3':'value3'} unpack(**my_dict) Out: value1 value2 value3
順便提一下哈,有關 args和kwargs的方法我會專門在後面的一期講,敬請期待!
字典推導式
這個我寫的比較糾結,由於諮詢了個人主管,他推薦我儘可能不要用,我也不太懂其中緣由,不知道有沒有大神能夠出來解答一下哈,具體用法和List的推導式同樣,上代碼:
import json first = {x:'A'+str(x) for x in range(8)} print(json.dumps(first,indent=4, sort_keys=True)) # 這種狀況用json輸出好看些 Out:{ "0": "A0", "1": "A1", "2": "A2", "3": "A3", "4": "A4", "5": "A5", "6": "A6", "7": "A7" }
或者能夠這麼用:
second={v:k for k,v in first.items()} print(json.dumps(second,indent=4)) Out:{ "A0": 0, "A1": 1, "A2": 2, "A3": 3, "A4": 4, "A5": 5, "A6": 6, "A7": 7 }
至於其餘亂七八糟的用法你們能夠本身去想哈哈
今天系統地爲你們梳理了幾點:
但願能夠幫到你們,後續若是我發想有什麼有意思的方法和技巧我會加上,若是你們對Dict
的其餘使用技巧感興趣,能夠關注個人微信公衆號Python極簡教程,我會把最高效,簡潔的小技巧一一記錄下來,分享給你們: