還不會使用Python中的字典?一文教會你所有的技巧


還不會使用Python中的字典?一文教會你所有的技巧


此係列文章收錄在公眾號(建議按順序閱讀本系列文章) : 數據大宇宙 > Python入門必備 > 必備知識


轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)

最近有許多小夥伴問我要入門 Python 的資料,還有小夥伴完全沒有入門 Python 就直接購買了我的 pandas 專欄。因此我決定寫幾篇 Python 數據處理分析必備的入門知識系列文章,以幫助有需要的小夥伴們更好入門。


不拆分啥初級中級高級,一個專欄直接帶你入門到高級應用,從數據處理到數據分析!!


前言

我們有一批個人信息(姓名、年齡等),在 Python 中使用元組+列表管理這些數據最適合不過。但是如果需要從裡面找出指定名字的信息呢?每次查找都遍歷嗎?這顯然不太科學。今天就來學下解決這一問題的大利器。



查找匹配的困境

如下個人信息數據定義:

還不會使用Python中的字典?一文教會你所有的技巧

  • 這相當於本系列之前學過的列表 + 元組 的知識點應用。
  • 使用元組承載不同類型的數據(一個人的各種類型的信息)
  • 使用列表承載同類型的數據(多個人的信息)

如何找出 A3 這個人的信息?使用遍歷+判斷即可:

還不會使用Python中的字典?一文教會你所有的技巧

  • 行7-9:遍歷每行記錄,並處理。注意這裡的代碼實際被執行了3次,因為有3行記錄
  • 行8:變量 r 表示每一行數據(是一個元組),通過 r[0] 訪問元組第一個值(名字),做判斷
  • "嗯,這符合 Python 的宣傳口號,簡單,直接!"
  • 我覺得還可以,但是如果需要多次查找,這代碼就太麻煩,一點都不清晰

這代碼表達的語義相當於,我聘請一位助手,教會他如下技能:

  • 給你一個數據表和一個名字
  • 你到數據表中一行行中的名字與我給的名字是否相同
  • 相同你就給把那一行給我

難道這語義有問題嗎?問題在於找一次的過程太慢了!如果要找多次,這會等到啥時候!

難道這助手就不能長點腦子,給我把名字記憶下來嗎?下次再去找的時候就不需要再一行行去翻了。



還不會使用Python中的字典?一文教會你所有的技巧


字典就是一個帶腦子的小助手

我希望代碼的語義(跟助手的說話)如下:

  • 給你一個數據表,你給我把名字和對應的行數記住(用腦子)
  • 下次我給你一個名字,你要馬上想出來對應的行數,然後把那一行數據給我

現在來看看代碼怎麼表達:

還不會使用Python中的字典?一文教會你所有的技巧

  • 行7:mapping = {} 定義一個空字典,此時"助手"大腦一片空白
  • 行9:仍然需要遍歷一次所有的記錄
  • 行11:mapping[name] = r ,把某個名字記下來,並且把該行記錄 r 給對應上
  • 行14:mapping['A2'] 即可立刻得到 "A2" 對應的數據(是一個元組)

你可以把字典想象成一個數據表:

還不會使用Python中的字典?一文教會你所有的技巧

  • key 列,保存了匹配查找時的關鍵值
  • value 列,保存了 key 對應的數據

看起來使用查找匹配用上字典真好,那麼是否只要是查找匹配的任務我都用上字典就好了?


看情況適用

從代碼可以看到,使用字典仍然需要遍歷一次數據表,如果你只是從不多的數據裡面查找一兩次,那麼真不需要使用字典。

反過來說,如果需要多次匹配查找,那麼使用字典就是一個不錯的選擇。

看到這裡,你還能發現使用字典的任務裡面有一個特徵?

字典只能處理"相等"匹配,你不要指望他能給你解決類似"找出大於某個日期的記錄"這樣子的任務。

看到這裡,又感覺字典沒啥用了。其實除了匹配查找他還能幹一些事情。


快速判斷是否存在

由於"助手"已經把名字記憶下來,因此如果你問他"張三是否在數據表中?"這樣的問題,他也能快速給你答案:

還不會使用Python中的字典?一文教會你所有的技巧

  • 行14:'張三' in mapping ,判斷某個值是否在字典的 key 列中
  • 在 Python 中, xx in 集合 ,是一個通用表達某個值是否在一個集合中的語義。由此你可以推斷,此語法同樣可以用在列表和元組中

但是,如果需要根據多列的信息定位一行數據,似乎字典做不到?


多個關鍵值

之前的例子一直只讓"助手"記憶"名字"這麼一個值的數據,其實他能記住多個值組成的數據。如下一個人地區表:

還不會使用Python中的字典?一文教會你所有的技巧

  • 希望"助手"記住 年級 + 班級,快速得到分數

"年級"與"班級"是2種不同性質的數據,此時你應該馬上想到元組:

還不會使用Python中的字典?一文教會你所有的技巧

  • 行12:r[:2] ,是從一個元組中使用切片,取開頭至索引2(不包含)之間的元素

此時查找同樣需要給他一個元組:

還不會使用Python中的字典?一文教會你所有的技巧


上面是一個 key("年級"與"班級"的元組) 對應一行數據,那麼是不是字典不能匹配多行數據?




還不會使用Python中的字典?一文教會你所有的技巧


一對多也行?

答案是,字典只能一對一匹配,但是不代表不能完成一對多匹配輸出。

如下是各個班的成績:

還不會使用Python中的字典?一文教會你所有的技巧

  • 我希望給出一個班別,快速得到該班的所有學生的記錄(多行)

代碼如下:

還不會使用Python中的字典?一文教會你所有的技巧

  • 行14:判斷班級值是否在字典,如果存在,表明此時已經執行過 行17 的代碼了。就是字典已經存在某個班級的key,此時對應的value必然是列表(因為 行17 我們放入了一個列表)。因此只需要往這個列表中追加記錄即可(列表的 append 方法)
  • 行17:當某個班級的記錄第一次出現時,就會執行到這裡,只需要把一個包含這行記錄的 r 的列表,放入字典的 value 即可

那麼此時查找某個班級的記錄,得到的結果將是一個列表:

還不會使用Python中的字典?一文教會你所有的技巧


是否感覺代碼中關於添加數據到列表的那段代碼有點難理解?

這不是因為你是初學者的關係,其實是代碼真寫的不好。有沒有一種語義直接是"按數據表中的班級,分組學生記錄到字典吧"這樣子的代碼呢?

真有(不是用 pandas 噢),請關注本入門系列,後面就會介紹(別揍我,一下子知道太多機密有危險)!


直接定義字典的數據

有時候字典的數據比較簡單,不需要從其他地方轉換得到,我們希望簡單定義即可。我相信認真閱讀文章的你,已經不知不覺學會了。

下面直接看個例子就可以秒懂:

還不會使用Python中的字典?一文教會你所有的技巧

  • 用 {} 表示一個字典
  • 在 {} 裡面填充東西,表示字典中的數據。由於字典中每一行數據都存在 key 與 value,因此使用 {key:value} 表示,用冒號把 key 與 value 分隔開來
  • 字典中的行之間用逗號分隔。 {key1:value1 , key2:value2}



總結

生成字典的方式:

  • {key1:value1,key2:value2}
  • 某個key in 字典 ,判斷字典是否存在指定key,返回的是 True 或 False (是或不是)

有任何疑問,私信我"python"



分享到:


相關文章: