Python 進價之路 (二) Dict 進價寶典,初二快樂!

新年快樂

大家好,今天是大年初二,身在國外沒有過年的氛圍,只能踏實寫寫文章,對社區做點貢獻,在此祝大家新年快樂!上一期爲大家梳理了一些List的進階用法,今天我們來看字典Dict的相關技巧,我個人在編程中對字典的使用非常頻繁,其實對於不是非常大的數據存儲需求,字典是一個不錯的選擇,比List要快的多,我在基礎篇裏面講過了一些關於dict的基礎方法,如果沒有看過的朋友們可以點擊鏈接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也可以很簡單的實現,有關創建就說這麼多啦

字典排序

有關字典排序,我們有兩種選擇,第一是根據字典的key值排序,第二是根據Value值排序,讓我們一個個來看,首先讓我們新建一個字典用於測試:

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)])
根據Key值排序

這裏我們創建一個字典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,看下結果:

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的感覺,哈哈

根據Value值排序

其實大家看到了根據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的用戶說一聲對不起,技術一直說是喜新厭舊呀,讓我們看一個小栗子:

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
     }

至於其他亂七八糟的用法大家可以自己去想哈哈

總結

今天系統地爲大家梳理了幾點:

  • 創建字典不同方法
  • 字典排序
  • 字典合併
  • 字典解包
  • json優化輸出
  • 字典推導式

希望可以幫到大家,後續如果我發想有什麼有意思的方法和技巧我會加上,再次祝大家新年快樂!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章