[19] Python集合與字典
1. 概述
今天介紹集合和字典。
- 計算機編程的原理簡要介紹
- 集成開發環境PyCharm
- 變數名、數字、字元串、列表
- 句式、注釋
- 輸入和輸出
- 條件判斷語句
- 循環語句
- 各類數據結構
- 函數
- 模塊和引入
2. 集合
集合(set)就是我們高中學的集合,並集、交集、補集、空集等,用大括弧表示。
# Define setsnset1 = {10, 20, 30, 40}nset2 = {20, 50, 60}n
由於是集合,不會出現一樣的元素(可以定義進去,但是相同數據會被合併),如果我們定義一個:
set3 = {10, 10, 20, 20, apple, banana, apple, }nprint(set3) # {apple, 10, 20, banana}n
最後等同於{apple, 10, 20, banana}。可以看到,最後由於集合的特點,重複的元素被合併,而且集合裡面元素也沒有順序,和數學課里學的一樣,集合三特點:確定性、無序性、互異性。
我們來看一下如何使用集合實現各種操作,
# 1. 判斷元素是否屬於集合(x ∈ A):innsetA = {apple, orange, banana}nprint(orange in setA) # Truenprint(lemon in setA) # Falsenn# 2. 判斷元素是否不屬於集合(x ? A):not innsetA = {apple, orange, banana}nprint(orange not in setA) # Falsenprint(lemon not in setA) # Truenn# 3. 並集(A ∪ B): |nsetA = {apple, orange, banana}nsetB = {apple, lemon, coconut}nprint(setA | setB) # {banana, coconut, lemon, orange, apple}nn# 4. 交集(A ∩ B):&nprint(setA & setB) # {apple}nn# 5. 差集(A - B),在A中但不在B中的元素集合:-nprint(setA - setB) # {orange, banana}nn# 6. 子集(C ? A)貌似應該是「真子集」:<nsetC1 = {apple, banana}nsetC2 = {apple, strawberry}nprint(setC1 < setA) # Truenprint(setC2 < setA) # Falsenn# 7. 其他符號:n# 子集:<=n# 包含:>, >=n# 兩集合相等:==nprint({1, 2, 3} == {3, 1, 2, 1, 2}) # Truen# 兩集合不相等:!=nn# 8. 空集:nempty = set()n# 注意不能只打一個大括弧,一個空的大括弧會被默認為一個空白字典。n
3. 將其他數據轉換為集合
如果想把其他數據轉換為集合,只需要在數據或者代表數據的變數外套上set()就行了。
# 1. 將字元串和列錶轉換為集合nsetS = set(banana)nprint(setS) # {a, n, b}nnsetL = set([apple, banana, orange, banana])nprint(setL) # {orange, apple, banana}n
可以看到講字元串轉換為集合時,每個字元被作為一個元素,由於集合的互異性,重複字元會被合併,最後banana轉換為集合後就只包含a、n、b三個字元。
# 2. update函數n# 用update()可以更新集合,把括弧里的數據轉換為集合再添加進去nsetS = set(banana) # {a, n, b}nsetS.update(banana!)nprint(setS) # {n, b, a, !}n# 最後比原來多了一個感嘆號nn# 3. add函數n# 用add()可以直接把括弧里的元素作為一個整體添加進集合nsetS = set(banana) # {a, n, b}nsetS.add(banana!)nprint(setS) # {b, n, banana!, a}nn# 4. 集合的迭代,和列表、元組一樣用nfor e in setS:n print(e)n
4. 字典
我們查字典的時候,比如成語字典,總是會看到這樣的格式:成語-解釋。Python的字典(dictionary)也是一樣的道理,長相和功能和我們生活中的字典十分相似,但是可應用的地方可比普通字典多多了。Python的字典也用大括弧表示,但是裡面的內容和集合不一樣,樣子是「鍵:值」,用逗號隔開,最後一個元素後面可加逗號可不加。
# Define a dictionaryndict1 = {NASA: National Aeronautics and Space Administration,n FBI: Federal Bureau of Investigation,n CIA: Central Intelligence Agency,n }n
這個字典就可以被用於通過查詢英文單詞縮寫來獲知其全稱。也就是說,冒號左邊的「鍵」就是我們要查詢的東西,而後面的「值」就是我們想要得到的解釋和內容。和普通字典一樣,鍵是唯一的、獨特的,成語字典里一個成語不可能出現被解釋多次,即使有多個意思,也是擠在同一個成語下面;而值則隨便,就像兩個不一樣的成語可以有完全一樣的意思。
字典的鍵得為不可變類型,比如數字、字元串和元組,值可以為任何數據類型,一般來說,字典的鍵需要越精簡越好,可以是學號,可以是「姓名」、「性別」等字元串,或者是英文單詞、成語等等,畢竟我們要訪問字典的時候不想打一堆字,而且叫都叫字典了,也得要有個字典的樣子。
5. 使用字典
我們來看一下如何訪問字典、添加元素、修改元素和刪除元素。
訪問字典:使用「變數名[鍵]」可以直接得到值,
print(dict1[FBI]) # Federal Bureau of Investigationn
如果鍵不存在,也就是我們自己做的字典里沒有錄進去,Python就會報錯:
print(dict1[NATO]) # KeyError: NATOn
判斷鍵是否有效:很多時候我們並不知道我們要查的內容是否在字典里,貿然使用肯定不行,那麼在使用前我們最好能判斷所查的鍵是否被編進字典了,用in就行了,和列表集合元組一樣,
if NATO in dict1:n print(dict1[NATO])nelse:n print(NATO has not been defined in your dictionary.)nn# NATO has not been defined in your dictionary.n
最後一行是運行上面代碼輸出的結果,我從運行結果里複製過來的。注意我們只能判斷這個鍵是否存在在字典里,而不能判斷某個值是否在字典了。
添加元素:有時候隨著時間的推移、程序的運行,我們要更新一開始的字典,
dict1[NATO] = North Atlantic Treaty Organizationn
這樣就把NATO和NATO的解釋添加進字典了,是不是很暴力?如果不信我們可以輸出一下試試看,
print(dict1)n# {NASA: National..., FBI: Federal..., CIA: Central..., NATO: North Atlantic Treaty Organization}n
這個結果太長了,我手動把一些內容用省略號表示了,意思達到了就行,NATO被成功添加進字典。
刪除字典:使用del可以刪除單個元素,要刪除多個元素,用逗號隔開就行,
del dict1[NATO], dict1[NASA]nprint(dict1)n# {FBI: Federal Bureau of Investigation, CIA: Central Intelligence Agency}n
如果刪除的元素本身就不在字典里,Python就會報錯。
清空字典:clear就行,簡單粗暴,
dict1.clear()nprint(dict1) # {}n
到這裡我們辛辛苦苦定義、修改的字典就全沒了。
字典的迭代:由於字典也是有一串數據,雖然嚴格意義上字典沒有順序,我們依然可以像集合一樣進行迭代,
dict2 = {name: Alice, gender: Female, age: 19}nfor key in dict2:n print("Applicants {} is {}".format(key, dict2[key]))n
結果為:
Applicants name is AlicenApplicants gender is FemalenApplicants age is 19n
6. 其他的字典使用方法
我們還能這樣定義一個字典,比如我們定義一個和上面dict2一樣的字典:
dict3 = dict([(name, Alice), (gender, Female), (age, 19)])n
如果我們的鍵都是簡短的字元串,也就是單個單詞或者連著的單詞的時候,我們可以用關鍵詞定義法:
dict4 = dict(name=Alice, gender=Female, age=19)n
還有一些字典的函數,簡單的有:
len(dict2): 字典dict2有幾個元素,即一共有幾個鍵ndict2.keys(): 查看dict2里所有的鍵,可以在外套一個list()把結果轉換為列表ndict2.values(): 查看dict2里所有的值,可以在外套一個list()把結果轉換為列表ndict2.items(): 查看dict2里所有的鍵和值,可以在外套一個list()把結果轉換為列表,每個元素為一個元組ndict2.update(dict3): 將dict3添加進dict2裡面,dict2被更新,如果有新增的元素則新增進dict2里,如果有重複的鍵則把dict3的鍵和值去覆蓋dict2的ndict2.has_key(key): 相當於in,查看dict2里是否含有某一特定鍵n
7. 複雜的程序
其實學到現在,我們已經基本接觸了所有的數據結構,加上基礎的條件判斷和循環語句,可以說Python最簡單的內容應該已經學完了,大家現在應該可以解決簡單的問題。接下來我將會給大家介紹Python入門的最後一章節內容函數和模塊。有了函數和模塊,我們就可以寫較為複雜的程序了,也是真正意義上的「完整程序」了。
另外,說到複雜的程序,我們也不可避免地要遇見複雜的數據結構,比如字典裡面的值即有單個值、也可能是列表或者其他字典,或者比如二維、三維、多維矩陣,這我們在以後會逐漸接觸到,複雜的數據結構使用方法和簡單的數據結構一樣,難點在於如何正確、有條不紊地處理。配合我們已經介紹的條件判斷語句、循環語句、各種單個數據結構使用方法以及一些內置函數像len、type等,大家現在可以嘗試著自己操作一下。不會的同學也不用著急,以後程序複雜起來了,我們自然也不得不擼起袖子跟它懟著干。
推薦閱讀: