那另外就是說呢,
另外就是說你可以用這個 key,如果你有一個
dictionary 的話,你可以用 key 或者用 value 這個 method
去把這個 dictionary 裡面的所有的 key 或者所有的 value 拉出來。
所以呢,你如果是做這個,比如說我們剛剛建構了這個 eng2cn
的這個 dictionary,如果 .keys 的話,
它就會把這個 eng2cn 所有的 keys 全部拉出來。
所以它就會跑出 'two' 'three' 'four' 'one' 這些所有的
keys,對不對?然後呢你如果把 這個 eng2cn.values
然後呢這個圓括號的話,就把所有的 values,所有這個 dictionary
所有的 values 都拉出來,就是是這個:'二' '三' '四' '一' 這樣子。
那當然就是有些時候我們要的是這個 key value 的
pair,對不對?那如果你是要 key value 的 pair 的話呢,你就可以用這個 這個
.items,那 .items 做什麼事情呢?它就會把所有的這個
裡面的這個 key value 全部回傳回來,每一個就是是一個 tuple,每一個是一個 tuple。
這樣子,第一個 element 是 key,第二個 element 是 value,這樣子。
那所以這個 dictionary
這個東西就是說 是有很多用途啦,那所以我們這邊舉一個是課本裡面的例子。
那課本裡面是說什麼呢?它是說 你事實上可以用來計算比如說某個字串裡面所有的
character 出現的頻率。
這些東西怎麼做呢? 比如說我們來定義一個函數叫做
histogram,那它傳進去是一個這個 sequence,
那我們在這邊就是你可以把它想像成就是我們到時候會用一個字串給它傳進去。
那這個,然後我們的目的就是要計算這個字串裡面每一個 character的
出現的次數,所以怎麼做呢?我們就先 initiate 一個 dictionary,d=dict()
dict(),有括號,對不對?就這樣給你一個新的空的一個 dictionary。
然後呢, 接下來我們就是這個 sequence 裡面一個一個 element 用 for
迴圈把它拉出來, 然後呢每一個 element 我們就看看說,這個 element
有沒有在原來的 dictionary? 如果它沒有在 dictionary
的話,我們的計數就是是先 count 1,因為它第一次看到嘛,所以 count 1。
如果說呢,它已經在 dictionary 的話呢,這邊是
如果,這個是 not in,那所以 else 就是是它是 in, in
的話呢,我們就把它 += 1,就是把它累加 1。
所以這樣子迴圈跑完之後呢,就是它會走過所有的你傳進去的 seq。
的裡面所有的 element,然後把每個 element
去算它這個每個 element 有沒有出現,有出現的話出現幾次,對不對。
然後呢,最後我們把這個 dictionary return 回來。
所以如果我們呼叫這個 histogram,然後給它一個比較長一點的
這個是 brontosaurus,brontosaurus 是什麼?你可以回去 Google 一下,它是一種龍,應該是雷龍。
就是雷龍是一種很大很大只的動物,然後你知道嗎,為什麼叫雷龍呢?因為它
很大只,所以它腳踩的時候就像打雷一樣,所以叫雷龍嘛。
把這個 h 印出來,它印出什麼呢?大家可以稍微想像一下啊。
它印出來類似像這樣子的東西,就是說它的 return
的東西第一事實上是一個 dictionary,所以這個 h 也是一個 dictionary。
那它會說 a 這個字串出現 1 次,b 出現 1
次,o 出現 2 次,n 出現 1 次,s 出現 2 次,r 出現 2 次,u 出現
2 次,依此類推,對不對? 所以這個就是是一個可以拿來計算
像這邊我們傳進去的是一個 string,你事實上可以傳進去一個 list。
同樣的程式也會 work,就不用做任何修改,也會 work,它就告訴你說某個元素出現幾次
這個事情,所以這個是相當方便,這常常也是我們拿來做 dictionary 的一個用途啦。
那當然就是說有了這個 dictionary 之後呢,你要輸出這個 dictionary
有時候 我們想要有一個比較漂亮的輸出,所以我們就可以做各式各樣不同的輸出方式。
比如說我們這邊就是是一種定義一個函數叫 print
_hist,就是說是我們要去印這個 dictionary 的這個內容,所以我們這邊可以做什麼事情呢?
我們可以把 這個
histogram,我們假設它是一個 dictionary,然後用一個 for 迴圈 for
key in hist,這時候它會 loop through 所有 histogram 裡面的
key, 就是說你如果把一個 dictionary 讓它去 loop 的時候,它事實上會
loop 這個裡面所有的,擺所有的 key 下去,下去把所有的元素全部 loop 一遍。
你就可以把這個 key 呢跟 histogram
的 key 對到的這個 value 把它印出來,所以這樣子的話呢
如果知道剛剛的這個,前面的這個 histogram 的 brontosaurus,然後
print_hist (h) 的話呢,它就會印出類似像這樣子的東西。
就是是 a 是 1 次,b 是 1 次,o 是 2 次,n 是 1
次,s 是 2 次,r 是 2 次,類似像這個樣子。
事實上還有別種做法,對不對?比如說呢你事實上可以用 前面我們說過一個
dictionary 是可以用 items 把所有的 pair 抓出來,對不對?每一個 pair 就是是一個 tuple。
所以呢,你就可以用一個 key, value 的 pair 去接這個 tuple,然後
把這個 key 跟 value 的這個值把它印出來。
這樣也是可以的,所以這樣子的做法就會跟之前得到很類似的東西, 但是是一個不同的做法。
所以就是說你事實上有不同的選擇,就是你可以選擇這樣做,那樣做。
另外一種做法就是說,如果說你想要這個 出來的,你想要輸出的東西是做某種排序,比如說要照
key 排序,那你要怎麼做呢? 那你一樣是把這個 key
抓出來之後呢,你把這個 key 呢你用這個 hist.keys 把所有的
key 抓出來,然後把這個 key 用 sorted 排序之後呢 然後
loop through 這個排序之後的結果,那這時候呢你就會有一個
然後呢針對每個 key 把它的值抓出來,印出來,這樣你就會有一個排序之後的
輸出,排序之後的輸出。
那 這個最後一個例子,就是說這個
dictionary 有些時候我們 現在是 key-value 嘛,有些時候我們想要從 value 對到
key,那怎麼做呢? 那我們可以反過來對應,可以反過來對應,那我想
這個地方呢也可以讓各位了解一下,通常資料結構 我們在設計資料結構的時候呢,它都會 good for
some tasks,but 對另外一些 tasks 不是那麼 efficient。
比如說像 dictionary 這個結構的話, 你建完之後呢,你要從 key 走到
value 是很簡單的, 但是你要從 value 走到 key 就不是那麼容易。
對不對?所以說呢,你如果要做一個 task,不是它當初設計來做的 task 的時候, 你就要付出額外的成本。
現在這邊呢,我們如果說除了關心說 某個這個字出現,某個
character 出現幾次之外,我們也關心說 出現 1 次的
character 有哪些的話呢,那這時候 這個原本的 dictionary
的這個 structure 就不是那麼 efficient,所以我們就可以 把它怎麼做呢?我們就是要建另外一個 dictionary 來做這個對應。
那你會說這樣子會有什麼問題呢?大家可以想想看,就是比如說,我們前面是說 a 出現
3 次,b 出現 5 次,c 出現 5 次,類似像這樣子的東西,對不對?那所以這時候
a b c d 都是 就是你有幾個英文字母,頂多就那麼多嘛。
但是你如果從,你如果反過來對應的話,出現 5 次的字母可能有 1 個 或 2 個或
3 個啊, 那你要怎麼辦呢?你如果要儲存這樣子的東西,你的
key 呢會是整數,這個是沒有問題的,它是 immutable,對不對? 但是你的
value 可能不止一個,對不對?這時候你就可以用一個 list 來 儲存這個東西,對不對?那
list 它是 mutable,list 是可以長大的,list 是可以長大的,所以就可以
不斷地把東西塞進去嘛,大概是這樣子,所以這個大概就是 inverted dictionary 在做的事情。
所以我們就是傳,inverted dictionary 是傳一個 dictionary 進去之後呢,我們做一個
起始一個 inv 這樣子的 dictionary,然後我們就是
for,我們就是走過所有的 原來傳進去這 dictionary 的 key,對不對?然後把它的
value 抓出來之後呢,我們去看說這個 value 呢 有沒有在這個 inverted
dictionary 裡面,如果沒有 的話,我們就建一個新的 entry,這個新的
entry 裡面只有 一個 element,就是是原來這個 key。
如果說呢,這個 element 已經有了的話呢,我們就把現在這個 key append 到原來那個 list 裡面。
對不對?所以這樣子就可以處理掉,所以這樣子 最後的結果就是說,本來是這個英文字母對到
幾次,對不對?所以我們如果做完之後,我們就可以由幾次對到 哪些英文字母,我們可以做這個事情。
所以呢,我們如果去 run 這個東西的話呢,
所以這邊這個 invert_dict 就是我們前面對應的那個東西,
那我們如果去執行看看,比如說我們先建一個 dictionary 是 parrot,
parrot 的 histogram,每個字母出現幾次,然後我們做一個 inverted dictionary,
然後呢我們就再來把這個 inverted dictionary 印出來,你可以想想看,你可以先想一下這個會發生什麼事情,
所以呢 parrot 的話呢,a 出現 1 次,對不對?p 出現 1 次,r 出現 2
次,t 出現 1 次,o 出現 1 次, 那這個 inverted dictionary 會告訴你說出現
1 次的有什麼,有 'a' 'p' 't' 'o',出現 2 次的有 r,大概是這個樣子。