Python 字典的多值用法

前言

相信有在寫 QA、Bot 的人都會碰到類似的問題,當 input 語言是中文的時候,通常都會發生有模糊字詞代表同一個 keyword 的狀況。
前幾天就碰到了這個狀況,一開始原本想要用 list 來解決,但是在多個 keyword 的時候就不適用了,
所以只能用 dict 的方法來解決這個問題。

dict 的結構

Python 的 dict 基本結構這邊就不多做介紹了,隨便拜一下大神就有了,但是當你想要一個 key 有多個 value 的時候該怎麼處理呢?
這時候 dict 中的 list 就能派上用場了。

value 用 list 來儲存

在設定 dict 的時候,每個目標的 keyword 把他當成 key 使用, values 則是儲存所有的 alt 也就是模糊字,
一般在使用字典的時候,格式美化之後應該是長這個樣子:

dict = {
'key_a': 'value_a',
'key_b': 'value_b',
'key_c': 'value_c'
}

這時候可以認知為 key_a 這個配對的value_a,但這樣子並不能滿足需求,所以我們可以讓 value 變成一個 list。

dict = {
'key_a': ['alt_value_a','alt_value_b','alt_value_c'],
'key_b': ['alt_value_d','alt_value_e','alt_value_f'],
'key_c': ['alt_value_g','alt_value_h','alt_value_i']
}

這樣子就符合我們的需求了,在一個 input 中有三個 keyword,而且每個 keyword 都有多個模糊字。

應用

上面已經解決了百分之 50 的問題,再來就是剩下的百分之 50,在配對模糊字詞的時候,應該是把字詞抓出來,然後丟進迴圈配對,
在只有 list 的時候非常的好解決,只要這樣做就好了:

for i in list:
  if i == key:
    return i

但是在 dict 的世界中是不能這樣用的。

迴圈 dict

迴圈的時候,我比較喜歡使用 .items() 進行迴圈,
所以我們迴圈 dict 的時候,會用兩個變數做迴圈。

dict = {
'key_a': ['alt_value_a','alt_value_b','alt_value_c'],
'key_b': ['alt_value_d','alt_value_e','alt_value_f'],
'key_c': ['alt_value_g','alt_value_h','alt_value_i']
}

for key, value in dict.items():
  for i in value:
    print(i)

這樣子做的時候,代表會 loop 第一個 key 跟 value,當 value 的迴圈結束了之後,才會進行下一個 key 的迴圈。
在一般 dict 的狀況下, value 只有一個,但現在我們把 value 用 list 儲存,所以我們可以再加上一個針對 value list 的迴圈。
結果的 output 會是這個樣子:

alt_value_a
alt_value_b
alt_value_c
alt_value_d
alt_value_e
alt_value_f
alt_value_g
alt_value_h
alt_value_i

可以發現他把全部的 list 都迴圈一次了,就可以開始做模糊字詞的搜尋了。

從 value 找 key

如果在 value 的 list 中比對到了模糊字詞,要怎麼樣把他返回正確的 keyword 讓後續的程式處理才好?
在上面的程式碼中,可以看到我們一開始設定的變數裡面有一個 key,這個變數可以直接輸出當前 key 的名稱。
所以稍作修改之後只要把 key 丟出去就好了:

bar = 要查詢的模糊字
foo = 要丟出去的 function 名稱

dict = {
'key_a': ['alt_value_a','alt_value_b','alt_value_c'],
'key_b': ['alt_value_d','alt_value_e','alt_value_f'],
'key_c': ['alt_value_g','alt_value_h','alt_value_i']
}

for key, value in dict.items():
  for i in value:
    if i == bar:
      return foo(key)

這樣就大功告成啦~

心得

我忘記是什麼時候開始喜歡使用 dict 的,我只記得為了搞清楚 dict 的用法跟 list 中調用的區分就花了好多時間去自己摸索、理解,
甚至是到最後的活用都花了不少時間,不過一切都理解了之後就覺得 dict 其實是個

平常的時候不知道該怎麼用,知道了之後事半功倍

的一個功能。

之前有幸能夠去某知名大學旁聽的時候發現好像很多新手都對 dict 的處理非常的棘手,教授也因為眾多學生提出的問題一時之間也沒辦法解釋清楚,
導致學生一片懵逼、作業繳交率極低,我才起了這篇文章的想法但一直沒寫,直到前幾天真的碰到了這個問題,就決定寫下來了。
也不是在批評還是什麼的,因為網路上的文章都說的非常零散,或者沒找對地方,就算是官方的 docs 也是非常難懂,
加上我這個人是從範例中學習的人,給我很多文字我根本看不下去,直接給我範例讓我修改、從 debug 中學習,直到自己能夠寫出來才是我認為學東西最快的方式。
在這裏已經盡了自己最大的努力解釋其中的用法了,希望有幫助到看到這裡的您。