7. Dict 一個靠標籤能查到東西的字典
在上一部分中我們提到,List 能動態增加長度、塞任何型態的資料 (字串、整數、浮點數),並能透過 Index 來取得一層層櫃子中的資料。
但如果標籤不是按照櫃子順序行嗎? 比如給各個資料一個專屬的標籤名稱、再根據標籤名稱取出資料?
再一次運用想像力,我們有另外一種櫃子,上面會貼有標籤名稱,比如放在「冰箱」標籤中的東西,或是放在「抽屜」標籤中。
這個標籤代表著東西放在哪邊,稱為 key (鍵值)。標籤可以是任何東西、裡面什麼都能放。
把這個概念移到 Python 中的 Dict 語法吧!
Dict 其實就是 Dictionary (字典) 的意思,我們有可以放在key是 ‘box’裡的變數、也可以有放在key是123裡的變數,key只能是不能修改的型態,包括字串(str)、整數(int)與浮點數(float)。
變數則和 List 一樣什麼都能放,比如變數可以是一個 List。
來看看一個 dict 語法吧,dict由大括號{}包住、元素以key:value的key-value pair組成 (key後面接冒號和變數value),並以由逗點, 隔開。
d = {123:'Snoopy', 'cat':['Pusheen', 'Kitty']}
注意:dict在輸出時並不保證key的順序。
我們一樣能用 len(dict) 來找出 dict 的大小:
但如果 dict 中有 list 呢? 長度會變成多少?
customer_profile = {1: ['Lynn', 1205, 'college'], 'id': 235}
印出來就知道啦。事實上是一樣的,我們只看key的數量。
另外,類似list可以用index來取值、比如list[index],dict同樣能用key來取值。當取到不存在的key時,相對於list中的IndexError,dict會顯示KeyError:
這邊來介紹一下 dict 的語法:
-
建立與刪除
- dict={}: 建立空的dict
- del dict[key]: 刪除特定的key-value pari
-
增加與更新
- dict[key]=value: 如果key不存在,會增加這組K-V;如果key已存在,會更新這組K-V。
-
for … in
- for [變數名稱] in dict:每一回合會拿到一把在dict裡的key,就可以用dict[key]拿到對應的變數。
● 小練習
讓使用者在名為table的dict中,輸入五組的key-value pair,key是字串、value是數字,最後把這個dict印出來。(提示: dict沒有append,直接用增加或更新(InsertOrUpdate)的方式)
除了用key找value,我們也可以反查,用value找出相對應的key:
或是檢查dict中有沒有包含特定的key:
若想拿到一個由所有key組成的list、或一個由所有value組成的list,可以使用dict.keys()或是dict.values()。結合反查的方法,可以檢查一個特定的key或value在這個dict中存不存在。
那如果有了key,想要把dict中相對應的資料取出來應該要怎麼做呢? 作法有兩個:
- d[key]: 這個做法相對不安全,key如果不存在的話就會出現KeyError (如同上面我們所示範的)。
- d.get(key, default_value): 是比較安全的作法,如果key不存在的話就會回傳 default_value (下面例子中的deafult_value就是’找不到耶’)。
● 小練習
一年一度的世界歌王大賽來啦!身為評審的你,請輸入五個歌手的名字與成績。接下來會有五次查詢的機會,每次查詢都可以讓觀眾輸入一個名字、來查看心愛的歌手。
如果歌手不在名單中,請輸出’這個人沒參賽喲’;如果歌手在名單中,請輸出該歌手的名字與成績。
最終專案:FB狂讚士
呼~好不容易走到這一步了,有沒有很興奮呢!!!!!! 接下來我們將開始撰寫人生中第一個爬蟲程式啦~
首先我們得到Facebook Developer(開發者中心) 網站上點選工具及支援,進入Graph API Explorer。
什麼是Graph API? 其實大家想要使用Facebook API的目的大多都是希望能夠擷取與使用者相關的一些物件 (人、網頁、相片…)與 連結關係(按讚、留言、標籤…)。
Facebook將這個概念稱之為Social Graph,而存取這些關係的API,就稱之為Graph API。透過Graph API,任何你需要Facebook提供的資訊都能從中拿到。
進入Graph API Explorer後拿取FB Access Token。這個Token代表你的身分,因此請謹記:絕對不要外流Token!!!
來設定一下權限吧,點擊Get User Access Token:
點選要開啟的權限,這邊我們設定 user_about_me、user_friends、user_photos和user-posts;也可以根據你想分析的內容勾選。最後按下Get Access Token。
如果想要自動發文和按讚的話,就要點選 publish_actions噢!
最後將那行超長的「存取權杖」字串給複製下來:
由於拿到了權限,我們可以在 GET 這邊輸入一些 API 的字串,按下Submit 後就可以看到一些個人訊息,比如/me查看個人檔案、/me/friends查看 FB 好友、/me/posts 查看貼文紀錄。
如果沒有出現相對應資料的話,表示Get Access Token剛剛勾選的時候沒有打開權限,再回去確認一下即可。
接下來的 code 比較多,我們切換回來編輯器 (Editor) 這邊、等程式碼寫完後再使用終端機 (Terminal) 把檔案啟動~ 做法是 python 檔名.py。
在使用 Graph API 之前,先安裝 Request Package,做法是打開Terminal,輸入$pip install requests 即可。
import facebook graph = facebook.GraphAPI(access_token='your_token', version='2.7')
嘗試玩幾個有趣的小專案!
這邊因為筆者的腦已經快爆炸了就純粹附上程式碼和結果供大家參考,有問題再來詢問嗚嗚嗚嗚QQQQ (也可以直接去看Graph API的Document, 相當清楚!)
1. 查出PO文的message,與創建PO文的時間
import facebook graph = facebook.GraphAPI(access_token='your_token', version='2.7') # Get the messsage of a post post = graph.get_object(id='665691423504646_1223557217718061') print(post['message']) # Get the created_time of the posts post_ids = ['665691423504646_1222774031129713', '665691423504646_1209392062467910'] posts = graph.get_objects(ids=post_ids) # Each given id maps to an object. for post_id in post_ids: print(posts[post_id]['created_time'])
對照一下… 文章”id”是”665691423504646_1222774031129713”的message是”類神經網路(Neural Network)”,而另外兩篇文章id的created_time也成功印在Terminal上了! 噢耶!
2. 自己幫自己按讚和PO文
import facebook graph = facebook.GraphAPI(access_token='your_token', version='2.7') #Put a like! 我是Node.js那篇網誌! graph.put_like(object_id='665691423504646_1222774031129713') # Put a comment! 我是GHOSTA Helmet影片分享 graph.put_comment(object_id='665691423504646_1216389925101457', message='我是一個Graph API測試~~~')
得澄清這真的不是我自己先按讚或自己去留言的XDD” 一樣成功了!
3. 自動PO文
import facebook graph = facebook.GraphAPI(access_token='your_token', version='2.7') # Post something! attachment = { 'name':'Post Test', 'caption': 'Check out this example', 'description': 'This is a longer description of the attachment', } graph.put_wall_post(message='我是一個Graph API測試, 大推Python超好玩!', attachment=attachment)
哇~~自動PO文出來啦~~~
4. 為心愛的人成為狂讚士吧!
import facebook graph = facebook.GraphAPI(access_token='your_token', version='2.7') # 來瘋狂幫艾瑪華森按讚吧 >///< profile = graph.get_object('emmawatson') posts = graph.get_connections(profile["id"], "posts") for posts in posts['data']: try: graph.put_object(posts['id'], "likes") print("LIKING: "+posts["message"]) except: continue
成功洗了 N 則艾瑪華森 FB 粉專貼文的讚…
今天的Python與FB Graph API教學先到這邊,真正要用到Dict來統計出朋友中留言和按讚數最高、最暗戀我們朋友的專案就留待下次再教學吧~~