教你Python字典的妙用,消除繁瑣的if判斷
↑↑↑關(guān)注后"星標"簡說Python
人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析 簡說Python推薦 來源:數(shù)據(jù)大宇宙 作者:卡門的兒子
前言
大家好,我是老表
根據(jù)不同的條件進行不同的計算或操作,是很常見的需求。Python 有 if 語句可以實現(xiàn)。但是一旦分支很多,多個 if 就是使你眼花繚亂。
我們有許多技巧(套路)來簡化這一過程。我會一連幾篇文章,從簡單到復(fù)雜,教你如何理解和應(yīng)用這些技巧。
這里,你可以學(xué)到很多 Python 知識點的應(yīng)用:
字典
枚舉
裝飾器
動態(tài)調(diào)用不同的函數(shù)
先看數(shù)據(jù):

列[計算方式],決定了列[調(diào)整]的計算結(jié)果
每一種計算方式如下:

聰明的方法,為每一種計算單獨定義了函數(shù):

但是,該怎么調(diào)用這些函數(shù)呢?
"很簡單呀,判斷,然后調(diào)用":

行9:為了防止出現(xiàn)遺漏的計算方式
這看起來不錯,但是,每新增一種方式,就要在這里追加一個判斷,一旦分支很多,這里的代碼就會非常冗長:

為什么我一直讓每一塊代碼盡可能簡短?
因為我們每次處理一個獨立小問題會比處理大問題要高效得多,大問題意味著涉及很多小問題。同時解決多個小問題,會讓我們的大腦短路。
單獨聲明映射關(guān)系
如果我們可以這樣子定義計算方式與函數(shù)的關(guān)系,那就很舒服了:

"這看著有點眼熟,不就是字典嗎?"
對,字典就是用來表達這種一對一關(guān)系的最佳結(jié)構(gòu)。
你可以把字典當(dāng)作是一個過目不忘(死記硬背)的記憶高手,只要他過一遍數(shù)據(jù)之后,你給他一個 key 值,他能馬上找出對應(yīng)的 value 值給你。
于是,我們可以把計算方式與定義的每個函數(shù)給他記憶:

接下來,真正處理每一行數(shù)據(jù)的時候,只需要讓他(字典)取出函數(shù),然后調(diào)用即可:

行2-4:特別要注意,字典的 value 我們只是給了函數(shù)名字,千萬別在后面加括號,括號是表示執(zhí)行函數(shù)?,F(xiàn)在我們不需要執(zhí)行函數(shù)呢
調(diào)用的時候,別忘記給函數(shù)傳入需要計算的指標
不僅代碼簡單了,如果你有留意左下角的運行時間,你會發(fā)現(xiàn)這種方式比之前的方式提速了
現(xiàn)在我們的代碼挺不錯,如果數(shù)據(jù)中出現(xiàn)了新的計算方式,但我們忘記加入字典,那么代碼運行就會報錯:

行4:注釋掉,相當(dāng)于我們忘記定義計算方式C
可以看到錯誤信息,能讓我們馬上聯(lián)想到原因
"一舉兩得,太完美了!"
但是,如果你跟我學(xué)習(xí) pandas ,就會知道,pandas 中盡可能避免自己遍歷處理數(shù)據(jù)。
pandas 的簡潔程度與計算效率不是我們自己遍歷處理可以比得過。
pandas 處理方式真的就完美?
這個例子中,每一種的計算方式的區(qū)別僅僅在于后面的系數(shù):

這種情況下,其實我們可以先批量把每一行對應(yīng)的系數(shù)取出來,然后直接計算:

注意執(zhí)行時間,又提速了
別以為這只是 pandas 把 for 遍歷給你寫了而已,他是基于 numpy 的,而numpy處理時都是基于 c++ 的調(diào)用,性能非??焖?/p>
這種方式其實也有他的缺點:
Series.map 方法的確做了字典取值做的事情,但是在他找不到key時,是不會報錯的。我們需要后續(xù)通過判斷 nan 來檢查
有時候計算邏輯沒有這么簡單,比如需要看銷量是否超過同地區(qū)的平均值做出不同的計算分支。這時候使用 pandas 的方式就會感覺邏輯被分散(下一節(jié)我們來看看這種情況下的處理)
"那么,之前的字典聲明方式,是不是就是這種場景下最通用的方式?"
思考題
用字典聲明對應(yīng)關(guān)系其實已經(jīng)非常好了,但是如果能在定義函數(shù)的地方上直接標記對應(yīng)關(guān)系,那么也挺好:

不再需要定義字典關(guān)系了
怎么可以做到這種效果呢?有興趣的小伙伴不妨試試。
--END--
掃碼即可加我微信
老表朋友圈經(jīng)常有贈書/紅包福利活動
學(xué)習(xí)更多: 整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機器學(xué)習(xí)等方面,別再說不知道該從哪開始,實戰(zhàn)哪里找了
優(yōu)秀的讀者都知道,“點贊”傳統(tǒng)美德不能丟 
