![還不會使用Python中的字典?一文教會你所有的技巧](http://p2.ttnews.xyz/loading.gif)
此係列文章收錄在公眾號(建議按順序閱讀本系列文章) : 數據大宇宙 > Python入門必備 > 必備知識
轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)
最近有許多小夥伴問我要入門 Python 的資料,還有小夥伴完全沒有入門 Python 就直接購買了我的 pandas 專欄。因此我決定寫幾篇 Python 數據處理分析必備的入門知識系列文章,以幫助有需要的小夥伴們更好入門。
不拆分啥初級中級高級,一個專欄直接帶你入門到高級應用,從數據處理到數據分析!!
前言
我們有一批個人信息(姓名、年齡等),在 Python 中使用元組+列表管理這些數據最適合不過。但是如果需要從裡面找出指定名字的信息呢?每次查找都遍歷嗎?這顯然不太科學。今天就來學下解決這一問題的大利器。
查找匹配的困境
如下個人信息數據定義:
![還不會使用Python中的字典?一文教會你所有的技巧](http://p2.ttnews.xyz/loading.gif)
- 這相當於本系列之前學過的列表 + 元組 的知識點應用。
- 使用元組承載不同類型的數據(一個人的各種類型的信息)
- 使用列表承載同類型的數據(多個人的信息)
如何找出 A3 這個人的信息?使用遍歷+判斷即可:
- 行7-9:遍歷每行記錄,並處理。注意這裡的代碼實際被執行了3次,因為有3行記錄
- 行8:變量 r 表示每一行數據(是一個元組),通過 r[0] 訪問元組第一個值(名字),做判斷
- "嗯,這符合 Python 的宣傳口號,簡單,直接!"
- 我覺得還可以,但是如果需要多次查找,這代碼就太麻煩,一點都不清晰
這代碼表達的語義相當於,我聘請一位助手,教會他如下技能:
- 給你一個數據表和一個名字
- 你到數據表中一行行中的名字與我給的名字是否相同
- 相同你就給把那一行給我
難道這語義有問題嗎?問題在於找一次的過程太慢了!如果要找多次,這會等到啥時候!
難道這助手就不能長點腦子,給我把名字記憶下來嗎?下次再去找的時候就不需要再一行行去翻了。
字典就是一個帶腦子的小助手
我希望代碼的語義(跟助手的說話)如下:
- 給你一個數據表,你給我把名字和對應的行數記住(用腦子)
- 下次我給你一個名字,你要馬上想出來對應的行數,然後把那一行數據給我
現在來看看代碼怎麼表達:
- 行7:mapping = {} 定義一個空字典,此時"助手"大腦一片空白
- 行9:仍然需要遍歷一次所有的記錄
- 行11:mapping[name] = r ,把某個名字記下來,並且把該行記錄 r 給對應上
- 行14:mapping['A2'] 即可立刻得到 "A2" 對應的數據(是一個元組)
你可以把字典想象成一個數據表:
- key 列,保存了匹配查找時的關鍵值
- value 列,保存了 key 對應的數據
看起來使用查找匹配用上字典真好,那麼是否只要是查找匹配的任務我都用上字典就好了?
看情況適用
從代碼可以看到,使用字典仍然需要遍歷一次數據表,如果你只是從不多的數據裡面查找一兩次,那麼真不需要使用字典。
反過來說,如果需要多次匹配查找,那麼使用字典就是一個不錯的選擇。
看到這裡,你還能發現使用字典的任務裡面有一個特徵?
字典只能處理"相等"匹配,你不要指望他能給你解決類似"找出大於某個日期的記錄"這樣子的任務。
看到這裡,又感覺字典沒啥用了。其實除了匹配查找他還能幹一些事情。
快速判斷是否存在
由於"助手"已經把名字記憶下來,因此如果你問他"張三是否在數據表中?"這樣的問題,他也能快速給你答案:
- 行14:'張三' in mapping ,判斷某個值是否在字典的 key 列中
- 在 Python 中, xx in 集合 ,是一個通用表達某個值是否在一個集合中的語義。由此你可以推斷,此語法同樣可以用在列表和元組中
但是,如果需要根據多列的信息定位一行數據,似乎字典做不到?
多個關鍵值
之前的例子一直只讓"助手"記憶"名字"這麼一個值的數據,其實他能記住多個值組成的數據。如下一個人地區表:
- 希望"助手"記住 年級 + 班級,快速得到分數
"年級"與"班級"是2種不同性質的數據,此時你應該馬上想到元組:
- 行12:r[:2] ,是從一個元組中使用切片,取開頭至索引2(不包含)之間的元素
此時查找同樣需要給他一個元組:
上面是一個 key("年級"與"班級"的元組) 對應一行數據,那麼是不是字典不能匹配多行數據?
一對多也行?
答案是,字典只能一對一匹配,但是不代表不能完成一對多匹配輸出。
如下是各個班的成績:
- 我希望給出一個班別,快速得到該班的所有學生的記錄(多行)
代碼如下:
- 行14:判斷班級值是否在字典,如果存在,表明此時已經執行過 行17 的代碼了。就是字典已經存在某個班級的key,此時對應的value必然是列表(因為 行17 我們放入了一個列表)。因此只需要往這個列表中追加記錄即可(列表的 append 方法)
- 行17:當某個班級的記錄第一次出現時,就會執行到這裡,只需要把一個包含這行記錄的 r 的列表,放入字典的 value 即可
那麼此時查找某個班級的記錄,得到的結果將是一個列表:
是否感覺代碼中關於添加數據到列表的那段代碼有點難理解?
這不是因為你是初學者的關係,其實是代碼真寫的不好。有沒有一種語義直接是"按數據表中的班級,分組學生記錄到字典吧"這樣子的代碼呢?
真有(不是用 pandas 噢),請關注本入門系列,後面就會介紹(別揍我,一下子知道太多機密有危險)!
直接定義字典的數據
有時候字典的數據比較簡單,不需要從其他地方轉換得到,我們希望簡單定義即可。我相信認真閱讀文章的你,已經不知不覺學會了。
下面直接看個例子就可以秒懂:
- 用 {} 表示一個字典
- 在 {} 裡面填充東西,表示字典中的數據。由於字典中每一行數據都存在 key 與 value,因此使用 {key:value} 表示,用冒號把 key 與 value 分隔開來
- 字典中的行之間用逗號分隔。 {key1:value1 , key2:value2}
總結
生成字典的方式:
- {key1:value1,key2:value2}
- 某個key in 字典 ,判斷字典是否存在指定key,返回的是 True 或 False (是或不是)
有任何疑問,私信我"python"
閱讀更多 外星人玩Python 的文章