Day 06 串列(list)、Tuple(元組)、字典(dict)、集合(set):我的字典裡沒有放棄,因為我還沒有寫進去(下)
註:本篇文章同步刊載於iT邦幫忙,為鐵人賽之系列文章。
https://ithelp.ithome.com.tw/articles/10240088/
接下來我們要介紹另外兩個資料型態:字典(dict)與集合(set)。
首先是字典:
字典跟串列有點類似的部分,
但是它的表示方式是一個鍵(key)對一個值(value),
就好像函式一樣,一個字典裡面不會出現重覆的key,
但有可能不同key對應的value剛好一樣;
這樣一來,我們就可以用key去查找其對應的value。
需要注意的是,串列是有一個固定的順序排列的,
但字典並不會有固定排序(也就是說一般我們不在意排的順序)。
key和value可以是各種不同的型態如str, int, float, bool等等,
但是key必須要是hashable的資料型態(像list就不是hashable),
value做為被對應的對象,則沒有這種限制。
字典的建立方式,可以用dict()方法,也可以用大括號{},
當中每個key和value的對應使用冒號:來分隔,
而每組key:value之間,使用逗號來分開。
同時,要取得某個key對應的value值,
就像list是用index來取得對應位置的値,字典則使用dict[key]來取得。
| |
上篇提到list()可以拿來轉換,dict()也有類似的特異功能,
只要內容是剛好每一組都是兩項的就可以了!
(串列/tuple/剛好兩個字元的字串…)
我們看一下範例:
| |
我們可以使用類似list的方式來對字典插入或修改某個key對應的value值,
如果該key已經存在在字典,則對應的value會被覆蓋,否則就產生一個新的對應。
| |
接下來是一些常見的dict操作方法,同樣請多加練習,
讀者可能會發現很多會跟list的操作概念相同,所以可以的話,請對照著比較一下。
dict1.update(dict2) -> 將dict2的內容複製後放到dict1(** key重覆時,dict2的value優先**)。
del dict1[‘key’] -> 將dict1的**’key’:’value’** 的對應從dict1中刪去**。
dict1.clear() -> ** 清空整個dict1的對應(也可以用dict1 = dict())。
‘XXX’ in dict1 -> 檢查dict1是否有’XXX’這個key。
dict1.keys() -> 給出整個dict1的** 所有key**(如果需要用list的形式表達,請用** list()將其框住)。
dict1.values() -> 同上,但給出的是所有value**。
dict1.items() -> 給出一個一個的** key:value對應**(每對都以tuple形式給出)。
dict2 = dict1.copy() -> 複製一份dict1的內容,生成一個dict2的字典。
(註:如果是用dict2 = dict1,只會讓兩者共用 一個字典,修改會動到同一個呦!)
我們來看一下範例:
| |
(註:在其他語言裡,通常把key:value對應的資料結構稱作hash或hash map)
接下來要講的是集合(set)。
集合不像字典,它的本身只有key而已,
每個key都必須不重覆 (就像數學學到的那樣)
要建立的方式,可以使用set(),或者使用大括號{},
當中每個key之間使用逗號連接,要增加key則使用add()。
(同樣用大括號,集合沒有value對應的部份)
集合本身也是不講求排列順序的,這點和字典一樣。
| |
既然是集合,可想而知就會有許多跟數學上集合對應的操作,
我們就直接來看範例:
| |
其他還有一些,但有需要用到時再查對應功能即可。
最後一樣來做個練習吧!
- 眾所周知,李嚴和劉昴星曾經比過炸龍蝦,
請建立一個字典名為shrimp,當中
請使用兩者的作品的名字做為key ,
將其做的炸蝦所使用到的材料/內容列表list做為value ,
還未做完成的部分不算 。請參考原本對於兩人作品的描述如下:
李嚴的作品:「我的料理是炸鳳尾蝦 ,就是蝦子 裹碎核果去炸的,將核果 搗碎後裹在蝦肉上,油 炸成為金黃色,不但要考慮核果跟蝦肉的比例,高低油溫的調節也需要高度的技術跟經驗的。鮮脆可口的核果外衣,經油炸之後,其香味立即倍增,堪稱人間第一美味,搭配特製醬汁來食用,味道更是妙不可言。跟醬汁巧妙的組合,這是這個炸蝦的精華所在。那個醬汁,那要先將蘋果,洋蔥等切成末之後,跟各種調味料以絕妙的比例互相調合。那個醬汁,再給我一分鐘我一定能完成的!」
劉昴星的作品:「炸的香酥的核果 外衣,蝦肉(蝦子 )的甘甜,與順滑可口的醬汁 搭配起來,真是太棒了……我在蝦肉和外衣之間,夾了豆皮 封住醬汁,如此一來,就算在油鍋裡炸,醬汁也一定不會流出來。裹著一層豆皮雲的龍蝦,名字叫做小當家特製雲龍炸蝦 !」
承1,請將兩人的材料從shrimp中取出,
分別放入兩個set中,並命名為’lee’跟’liu’。
請利用set的操作,回答以下問題:
劉昴星的作品中比李嚴的作品多用了什麼材料?
李嚴的作品中比劉昴星的作品多用了什麼材料?
兩人的作品都有用到什麼材料?
假定今天李嚴能做完醬汁的話,請將新增的材料(蘋果、洋蔥)以及內容(醬汁),
加到lee這個set中,
接著請指出現在李嚴的作品中比劉昴星的作品多用了什麼材料?
並請將材料和內容更新回shrimp這個字典中的對應作品。已知有一個列表lt = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
請利用slice及其他方法來達成以下要求:
a. 請生成一個lt1,其內容為lt的所有奇數
b. 請生成一個lt2,其內容為lt的所有偶數
c. 請將lt2的所有元素依序附加到lt1上
d. 請刪除lt1當中index 7和index 1的數
e. 請將lt1進行排序
辛苦了,這兩篇對於初學者來說應該很長,
但很基本,請多加嘗試練習,
後續使用到對應用法如果還是忘記的話,
可以再回頭看著對照。
那就明天見囉!
工商時間:
抽獎活動還在繼續累積人數(現在好像沒有人想抽XD)
在Python Taiwan的連結第100篇的文章 底下,
公開分享到你的臉書、按讚該篇文章、並留言告訴我說,
「你最喜歡這一整個系列的哪一篇?為什麼?」或
「除了從LeetCode學演算法系列以外,
你還想要看到關於什麼方向的文章?」
超過20則留言的話 (有完成以上步驟的才算),我們就抽一組
「從Leetcode學演算法|進階篇」+「從Leetcode學演算法|面試篇」
課程的免費兌換券進行贈送!
期限嘛…就延長到滿人數吧XDD (不然也沒辦法哈哈)
容筆者工商一下,
「從Leetcode學演算法|進階篇」 開放預購啦!
這次選了40道難度加深的LeetCode題目,
同樣也會細部解說對應的技巧及須要掌握的演算法!
同時這次購買進階篇的話,
額外還加贈**「從Leetcode學演算法|面試篇」** !
當中包含了面試準備須知分享 ,及訪談國內外不同經驗的工程師 ,
讓你不論是想走前端/後端/一般軟工 或者是想找國外的工作 ,
是初學想轉職 還是正在工作 ,都能夠從中得到收穫呦!
有興趣的朋友可以使用下面的早鳥優惠~
「從Leetcode學演算法|進階篇」+「從Leetcode學演算法|面試篇」 :
https://bit.ly/advleetcode
「從Leetcode學演算法」全套(基礎/進階/面試篇)同捆優惠:
https://bit.ly/allleetcode
