Python資料儲存容器tuple-串列-字典-集合
以下為本文章儲存在Google Colab的程式碼
(1)Python的儲存容器--tuple
https://colab.research.google.com/drive/1JwYte5JlHGs9QPCFhdR_aduyHjokTv2x?usp=sharing
(2)Python的儲存容器--list
https://colab.research.google.com/drive/1NACtrRf5Zctz8kjmqnBCOijMmXVcTyCE?usp=sharing
(3)Python的儲存容器--dict
https://colab.research.google.com/drive/1l1JXFlX99uDLXWtJ4PiIx0XjUWEH9MKY?usp=sharing
(4)Python的儲存容器--set
https://colab.research.google.com/drive/1XJTH1iMw6wuFeM7npZoS88uV_GHnwzwQ?usp=sharing
Python的資料儲存容器
Python的資料儲存容器,可以分為tuple、串列(list)、字典(dict)與集合(set)四種,每一種結構都有其適合使用的情況與使用限制。tuple用於依序儲存資料,可以依照順序取出資料,但不能更改,是不可變的物件;串列(list)也是用於依序儲存資料,可以依照順序取出,也可以更改。字典(dict)儲存的資料為「鍵(key)」與「值(value)」對應的資料,使用「鍵」查詢「值」。取出字典所有資料後,發現與建構字典時輸入資料的順序不同,字典儲存資料是沒有順序性的,字典也可視為關聯性陣列(associative array)。集合(set)儲存沒有順序性的資料,要找出資料是否存在,儲存不需要鍵與值對應的資料,就很適合使用集合。
(A)tuple
使用「( )」建立tuple,tuple在Python中表示連續資料元素串接在一起,且tuple是不可以更改。
使用「( )」建立tuple。
程式
t1 = ()
print(t1)
執行結果
()
也可以使用「,」串接資料形成tuple。
t2 = 1, 2 ,3
print(t2)
(1, 2, 3)
只使用「,」串接資料形成tuple,但這樣不是很明確,一般而言會再加上()表示是tuple
t3 = (1, 2, 3)
print(t3)
(1, 2, 3)
可以在tuple使用「[ ]」取出個別元素。
t3 = (1, 2, 3)
print(t3[0])
1
我們可以使用變數取出tuple中的元素,稱作unpacking(開箱)。
t3 = (1, 2, 3)
a, b, c= t3
print('a=', a, ',b=', b, ',c=', c)
a= 1 ,b= 2 ,c= 3
可以使用tuple交換兩數
a = 10
b = 20
print('交換前','a=', a, ',b=', b)
a, b = b, a
print('交換後','a=', a, ',b=', b)
交換前 a= 10 ,b= 20
交換後 a= 20 ,b= 10
可以使用函式tuple將串列轉換成tuple,串列將於下一個單元介紹。
list1=[1,2,3,4]
t4 = tuple(list1)
print(t4)
(1, 2, 3, 4)
tuple中元素可以是tuple,內部的tuple會被視為一個元素,存取內部tuple需要使用兩層中括號[]進行存取。
t4 = (1,2,3,4)
t5 = (t4,5,6)
print(t5)
print(len(t5))
print(t5[0][0])
((1, 2, 3, 4), 5, 6)
3
1
若只有一個元素的tuple需在元素後面加上逗點「,」,沒有加上逗點「,」就不是tuple。
t6 = ('z', )
print(t6)
('z',)
(B)串列(list)
串列為可修改的序列資料,可以修改元素資料、新增、刪除、插入與取出元素,使用list函式可以將資料轉換成串列,並可以使用[::]取出串列的一部分。
(B-1)新增與修改串列
使用「[]」建立新的串列,使用「[索引值]」讀取個別元素。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
print('購物清單shoplist為')
print(shoplist)
執行結果
購物清單shoplist為
['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
print('顯示shoplist[0]為',shoplist[0])
執行結果
顯示shoplist[0]為 牛奶
使用「len函式」讀取串列長度。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
print('購物清單shoplist的長度為', len(shoplist))
執行結果
購物清單shoplist的長度為5
使用「串列[索引值]=元素值」修改個別元素。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
shoplist[1] = '皮蛋'
print("執行 shoplist[1] = '皮蛋' 後")
print(shoplist)
執行結果
執行 shoplist[1] = '皮蛋' 後
['牛奶', '皮蛋', '咖啡豆', '西瓜', '鳳梨']
使用「函式index」取出指定元素的索引值。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
index=shoplist.index('咖啡豆')
print("執行 index=shoplist.index('咖啡豆') 後")
print('index=', index)
執行結果
執行 index=shoplist.index('咖啡豆') 後
index= 2
使用「函式append」將元素增加到串列的最後。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
shoplist.append('麵包')
print("執行 shoplist.append('麵包')後")
print(shoplist)
執行結果
執行 shoplist.append('麵包')後
['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨', '麵包']
使用「函式insert」將元素插入到串列的指定位置。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
shoplist.insert(4, '蘋果')
print("執行 shoplist.insert(4, '蘋果') 後")
print(shoplist)
執行結果
執行 shoplist.insert(4, '蘋果') 後
['牛奶', '蛋', '咖啡豆', '西瓜', '蘋果', '鳳梨']
使用「函式remove」將指定的元素從串列中移除。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
shoplist.remove('蛋')
print("執行 shoplist.remove('蛋') 後")
print(shoplist)
執行結果
執行 shoplist.remove('蛋') 後
['牛奶', '咖啡豆', '西瓜', '鳳梨']
使用「函式del」將串列中第幾個元素刪除。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
del shoplist[0]
print("執行 del shoplist[0] 後")
print(shoplist)
執行結果
執行 del shoplist[0] 後
['蛋', '咖啡豆', '西瓜', '鳳梨']
使用「函式pop」將串列中第幾個元素刪除,若不指定元素則刪除最後一個元素。
程式
shoplist = ['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
shoplist.pop(0)
print("執行 shoplist.pop(0) 後")
print(shoplist)
shoplist.pop()
print("執行 shoplist.pop() 後")
print(shoplist)
shoplist.pop(-1)
print("執行 shoplist.pop(-1) 後")
print(shoplist)
執行結果
執行 shoplist.pop(0) 後
['蛋', '咖啡豆', '西瓜', '鳳梨']
執行 shoplist.pop() 後
['蛋', '咖啡豆', '西瓜']
執行 shoplist.pop(-1) 後
['蛋', '咖啡豆']
使用「函式sort」排序串列元素。
程式
shoplist = ['milk', 'egg', 'coffee', 'watermelon']
shoplist.sort()
print("執行 shoplist.sort() 後")
print(shoplist)
執行結果
執行 shoplist.sort() 後
['coffee', 'egg', 'milk', 'watermelon']
串列以包含各種資料型別的元素。
程式
list = [1,2.0,3,'Python']
print("串列可以包含各種資料型別的元素")
print(list)
執行結果
串列可以包含各種資料型別的元素
[1, 2.0, 3, 'Python']
使用「for 變數 in 串列」可以讀取串列所有元素到「變數」,將之後網頁詳細介紹for迴圈的各種應用。
程式
shoplist = ['milk', 'egg', 'coffee', 'watermelon']
for item in shoplist:
print(item)
執行結果
milk
egg
coffee
watermelon
(B-2)串接兩個串列
使用「+」串接兩個串列
程式
shoplist1 = ['牛奶', '蛋', '咖啡豆']
shoplist2 = ['西瓜', '鳳梨']
shoplist_all = shoplist1 + shoplist2
print(shoplist_all)
執行結果
['牛奶', '蛋', '咖啡豆', '西瓜', '鳳梨']
(B-3)產生串列
使用「函式list」產生串列,函式list可以輸入字串或tuple。
程式
list1 = list('python')
print(list1)
tuple2 = ('a', 'b', 1, 2)
list2 = list(tuple2)
print(list2)
執行結果
['p', 'y', 't', 'h', 'o', 'n']
['a', 'b', 1, 2]
使用「函式split」也會回傳串列。
程式
list3 = "2016/1/1".split('/')
print(list3)
執行結果
['2016', '1', '1']
(B-4) 使用「[開始:結束:間隔]」存取串列
使用「[開始:結束:間隔]」切割字串,從「開始」到「結束」(不包含結束的字元)每隔「間隔」個字元取一個字元出來。
list[:]表示取串列list的每一個元素,若沒有指定結束元素,預設使用最後一個元素結束,若沒有指定開始元素,預設使用第一個元素開始。
程式
a = list('abcdefghijk')
print('a[:]為', a[:])
執行結果
a[:]為 ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
list[開始:]表示取串列list[開始]到串列list結束的所有元素,若沒有指定結束元素,預設使用串列list最後一個元素,包含最後一個元素。
list[:結束]表示取串列list第一個元素到串列list[結束]所指定元素的前1個元素為止的所有元素,若沒有指定開始元素,預設使用串列list第一個元素開始。
程式
a = list('abcdefghijk')
print('a[:5]為', a[:5])
print('a[5:]為', a[5:])
print('a[:-5]為', a[:-5])
print('a[-5:]為', a[-5:])
執行結果
a[:5]為 ['a', 'b', 'c', 'd', 'e']
a[5:]為 ['f', 'g', 'h', 'i', 'j', 'k']
a[:-5]為 ['a', 'b', 'c', 'd', 'e', 'f']
a[-5:]為 ['g', 'h', 'i', 'j', 'k']
list[開始:結束]表示取串列list[開始]元素到串列list[結束]所指定元素的前1個元素為止的所有元素。
程式
a = list('abcdefghijk')
print('a[0:4]為', a[0:4])
print('a[-5:-3]為', a[-5:-3])
執行結果
a[0:4]為 ['a', 'b', 'c', 'd']
a[-5:-3]為 ['g', 'h']
list[開始:結束:間隔]表示取串列list [開始]元素到串列list[結束]所指定元素的前1個元素為止的所有元素,每隔「間隔」個元素取一個元素。
程式
a = list('abcdefghijk')
print('a[1:10:3]為', a[1:10:3])
print('a[-1:-4:-1]為', a[-1:-4:-1])
執行結果
a[1:10:3]為 ['b', 'e', 'h']
a[-1:-4:-1]為 ['k', 'j', 'i']
list[::-1]表示反轉串列list,反轉串列為串列中第1個元素與最後1個元素互換,第2個元素與倒數第2個元素互換,第3個元素與倒數第3個元素互換,一直到只剩下一個元素或沒有元素可以互換為止。
程式
a = list('abcdefghijk')
print('a[::-1]為', a[::-1])
執行結果
a[::-1]為 ['k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
綜合上述,若「開始」沒有指定數值,以串列最開始的元素開始,也就是預設使用0;若「結束」沒有指定數值,以串列最右邊的元素結束(包含該元素)。若「間隔」大於0,表示由左到右取出元素;若「間隔」小於0,表示由右到左取出元素。
(C) 字典(dict)
字典(dict)儲存的資料為「鍵(key)」與「值(value)」對應的資料,使用「鍵」可以搜尋對應的「值」,取出字典的所有資料時,發現與建構字典時輸入資料的順序不同,字典儲存資料是沒有順序性的,字典中的「鍵」需使用不可以變的元素,例如:數字、字串與tuple。字典可以新增、刪除、更新與合併兩個字典。
(C-1) 新增與修改字典
使用「{}」建立新的字典,字典以「鍵(key):值(value)」表示一個元素,在「鍵」與「值」的中間使用一個冒號「:」。
程式
dict1={}
print(dict1)
lang={'早安':'Good Morning', '你好':'Hello' }
print(lang)
執行結果
{}
{'你好': 'Hello', '早安': 'Good Morning'}
使用「字典[鍵]」讀取鍵(key)所對應的值(value)。
程式
lang={'早安':'Good Morning', '你好':'Hello'}
print('「你好」的英文為',lang['你好'])
執行結果
「你好」的英文為 Hello
若「字典[鍵]」所讀取的鍵不存在字典內,會發出KeyError的例外(exception),程式無法執行完畢,所以此行以「#」進行註解,程式才能正確執行。若要執行此行則要將「#」去除,程式就會發出KeyError的例外。
程式
lang={'早安':'Good Morning', '你好':'Hello'}
print('「你好嗎」的英文為',lang['你好嗎'])
執行結果
Traceback (most recent call last):
File "G:\ch3\3-3-1-dict1.py", line 6, in <module>
print('「你好嗎」的英文為',lang['你好嗎'])
KeyError: '你好嗎'
使用「函式get」讀取「鍵」所對應的「值」,若「鍵」不存在字典內,則回傳None,程式會繼續執行,若在get函式增加第二個參數,若「鍵」不存在字典內,則回傳第二個參數所輸入的資料。
程式
lang={'早安':'Good Morning', '你好':'Hello'}
print('「你好」的英文為',lang.get('你好'))
print('「你好嗎」的英文為',lang.get('你好嗎'))
print('「你好嗎」的英文為',lang.get('你好嗎','不在字典內'))
執行結果
「你好」的英文為 Hello
「你好嗎」的英文為 None
「你好嗎」的英文為 不在字典內
使用「字典[鍵]=值」修改個別元素與新增元素,若「鍵」存在字典內,則修改該鍵所對應的值;若「鍵」不存在字典內,則新增該鍵與值的對應。
程式
lang={'早安':'Good Morning', '你好':'Hello'}
lang['你好']='Hi'
print(lang)
lang['學生']='Student'
print(lang)
執行結果
{'早安': 'Good Morning', '你好': 'Hi'}
{'學生': 'Student', '早安': 'Good Morning', '你好': 'Hi'}
使用「del 字典['鍵']」會將字典中指定的「鍵」刪除,所對應的「值」也會刪除。
程式
lang={'早安':'Good Morning', '你好':'Hello'}
del lang['早安']
print(lang)
執行結果
{'你好': 'Hello'}
使用「函式clear」清空整個字典。
程式
lang={'早安':'Good Morning', '你好':'Hello'}
lang.clear()
print(lang)
執行結果
{}
(C-2) 將tuple或串列轉換成字典
使用「函式dict」將tuple或串列轉換成字典,可以串列中包含串列,串列中包含tuple,tuple中包含串列,tuple中包含tuple,內層的串列或tuple使用兩個元素對應,前者會轉換成「鍵」,而後者轉換成「值」。
程式
a=[['早安','Good Morning'],['你好','Hello']]
dict1=dict(a)
print(dict1)
b=[('早安','Good Morning'),('你好','Hello')]
dict2=dict(b)
print(dict2)
c=(['早安','Good Morning'],['你好','Hello'])
dict3=dict(c)
print(dict3)
d=(('早安','Good Morning'),('你好','Hello'))
dict4=dict(d)
print(dict4)
執行結果
{'早安': 'Good Morning', '你好': 'Hello'}
{'早安': 'Good Morning', '你好': 'Hello'}
{'早安': 'Good Morning', '你好': 'Hello'}
{'早安': 'Good Morning', '你好': 'Hello'}
(C-3) 使用「函式update」合併兩個字典
使用「函式update」將兩個字典合併成一個字典,例如:dict1.update(dict2),若有重複的「鍵」,會將dict2的「鍵」與「值」取代dict1的「鍵」與「值」。
程式
lang1={'你好':'Hello'}
lang2={'學生':'Student'}
lang1.update(lang2)
print(lang1)
lang1={'早安':'Good Morning','你好':'Hello'}
lang2={'你好':'Hi'}
lang1.update(lang2)
print(lang1)
執行結果
{'學生': 'Student', '你好': 'Hello'}
{'早安': 'Good Morning', '你好': 'Hi'}
(C-4) 使用「函式copy」複製字典
使用「函式copy」複製字典,例如:dict2=dict1.copy(),會複製dict1到dict2,dict1與dict2指向不同的字典物件,若更改字典dict1的元素,並不會修改字典dict2;若使用「dict2=dict1」,則dict1與dict2指向同一個字典物件,修改字典dict1的元素,字典dict2也會更改。
程式
lang1={'早安':'Good Morning','你好':'Hello'}
lang2 = lang1
lang2['你好']='Hi'
print('lang1為', lang1)
print('lang2為', lang2)
lang1={'早安':'Good Morning','你好':'Hello'}
lang3 = lang1.copy()
lang3['你好']='Hi'
print('lang1為', lang1)
print('lang3為', lang3)
執行結果
lang1為 {'你好': 'Hi', '早安': 'Good Morning'}
lang2為 {'你好': 'Hi', '早安': 'Good Morning'}
lang1為 {'你好': 'Hello', '早安': 'Good Morning'}
lang3為 {'你好': 'Hi', '早安': 'Good Morning'}
(C-5) 使用「for」讀取字典每個元素
使用「for」讀取字典每個元素,配合字典的「函式items」會回傳「鍵」與「值」兩個元素,配合字典的「函式keys」會回傳「鍵」,而配合字典的「函式values」會回傳「值」。
程式
lang={'早安':'Good Morning','你好':'Hello'}
for ch, en in lang.items():
print('中文為', ch, '英文為', en)
for ch in lang.keys():
print(ch,lang[ch])
for en in lang.values():
print(en)
執行結果
中文為 你好 英文為 Hello
中文為 早安 英文為 Good Morning
你好 Hello
早安 Good Morning
Hello
Good Morning
(D) 集合(set)
集合(set)儲存沒有順序性的資料,要找出資料是否存在,集合內元素不能重複,集合會自動刪除重複的元素。
(D-1) 新增與修改集合
使用「set()」或「{}」建立新的集合,集合會自動刪除重複的元素,「set()」只能使用一個參數,這個參數可以是字串、tuple、串列或字典都可以建立集合。
程式
s = {1,2,3,4}
print(s)
s = set(('a',1,'b',2))
print(s)
s = set(['apple', 'banana', 'apple'])
print(s)
s = set({'早安':'Good Morning', '你好':'Hello'})
print(s)
s = set('racecar')
print(s)
執行結果
{1, 2, 3, 4}
{1, 2, 'b', 'a'}
{'apple', 'banana'}
{'早安', '你好'}
{'r', 'e', 'c', 'a'}
使用「函式add」新增集合元素,使用「函式remove」刪除集合元素。
程式
s = set('tiger')
print(s)
s.add('z')
print(s)
s.remove('t')
print(s)
執行結果
{'g', 't', 'i', 'e', 'r'}
{'g', 'i', 'z', 'e', 'r', 't'}
{'g', 'i', 'z', 'e', 'r'}
(D-2) 集合的運算
可以將任兩個集合進行聯集(|)、交集(&)、差集(-)與互斥或(^)運算,下表介紹這四種運算。
(D-3) 集合的比較
可以將任兩個集合進行子集合(<=)、真子集合(<)、超集合(>=)與真超集合(>)等四個比較運算,下表介紹這四種比較運算。
(E) 範例練習
(E-1) 待辦事項
請設計一個程式將輸入的五項工作加入串列中,取出最先加入的兩項工作,顯示取出的工作與剩餘的工作,接著取出最後加入的一項工作,顯示取出的工作與剩餘的工作。
解題想法
利用串列紀錄待辦事項,使用函式append將工作加入待辦事項,函式pop取出待辦事項,使用函式print顯示待辦事項。
程式碼
行
1
2
3
4
5
6
7
8
9
10
11
12
13
程式碼
待辦事項 = []
工作 = input('請輸入待辦事項?')
待辦事項.append(工作)
工作 = input('請輸入待辦事項?')
待辦事項.append(工作)
工作 = input('請輸入待辦事項?')
待辦事項.append(工作)
工作 = input('請輸入待辦事項?')
待辦事項.append(工作)
工作 = input('請輸入待辦事項?')
待辦事項.append(工作)
print(待辦事項.pop(0), 待辦事項.pop(0), 待辦事項)
print(待辦事項.pop(), 待辦事項)
執行結果
請輸入待辦事項?打球
請輸入待辦事項?閱讀
請輸入待辦事項?吃飯
請輸入待辦事項?借書
請輸入待辦事項?寫程式
打球 閱讀 ['吃飯', '借書', '寫程式']
寫程式 ['吃飯', '借書']
解說
第1行:設定待辦事項為空串列。
第2行:顯示「請輸入待辦事項?」在螢幕上,經由input函式允許輸入資料,將輸入的字串,指定給變數「工作」。
第3行:使用函式append將變數「工作」加入到串列「待辦事項」。
第4行:顯示「請輸入待辦事項?」在螢幕上,經由input函式允許輸入資料,將輸入的字串,指定給變數「工作」。
第5行:使用函式append將變數「工作」加入到串列「待辦事項」。
第6行:顯示「請輸入待辦事項?」在螢幕上,經由input函式允許輸入資料,將輸入的字串,指定給變數「工作」。
第7行:使用函式append將變數「工作」加入到串列「待辦事項」。
第8行:顯示「請輸入待辦事項?」在螢幕上,經由input函式允許輸入資料,將輸入的字串,指定給變數「工作」。
第9行:使用函式append將變數「工作」加入到串列「待辦事項」。
第10行:顯示「請輸入待辦事項?」在螢幕上,經由input函式允許輸入資料,將輸入的字串,指定給變數「工作」。
第11行:使用函式append將變數「工作」加入到串列「待辦事項」。
第12行:使用串列「待辦事項」的函式pop,輸入數值0,表示取出最先加入的工作,使用函式print顯示到螢幕上,接著再次使用串列「待辦事項」的函式pop,輸入數值0,表示取出最先加入的工作,使用函式print顯示到螢幕上,最後顯示整個串列「待辦事項」到螢幕上。
第13行:使用串列「待辦事項」的函式pop,不輸入任何值,表示取出最後加入的工作,使用函式print顯示到螢幕上,最後顯示整個串列「待辦事項」到螢幕上。
(E-2) 製作英翻中字典
請設計一個程式將英文單字翻譯成中文,輸入英文可以查詢到對應的中文,顯示字典的英文單字有哪些,與顯示整個字典。
解題想法
英文與中文對應的關係儲存到字典(dict)結構內,使用字典的功能完成程式。
程式碼與解說
行
1
2
3
4
5
程式碼
字典 = {'dog':'狗', 'fish':'魚', 'cat':'貓', 'pig':'豬'}
print(字典.keys())
print(字典)
英文 = input('請輸入一個英文單字?')
print(字典.get(英文,'字典找不到該單字'))
執行結果
第一次執行輸入「dog」,結果如下。
dict_keys(['cat', 'dog', 'fish', 'pig'])
{'cat': '貓', 'fish': '魚', 'dog': '狗', 'pig': '豬'}
請輸入一個英文單字?dog
狗
第二次執行輸入「turtle」,結果如下。
dict_keys(['cat', 'dog', 'fish', 'pig'])
{'cat': '貓', 'fish': '魚', 'dog': '狗', 'pig': '豬'}
請輸入一個英文單字?turtle
字典找不到該單字
解說
第1行:建立四個單字的字典,指定給變數「字典」。
第2行:使用函式print顯示變數「字典」的函式keys的結果到螢幕上。
第3行:使用函式print顯示變數「字典」到螢幕上。
第4行:顯示「請輸入一個英文單字?」在螢幕上,經由input函式允許輸入資料,將輸入的字串指定給變數「英文」。
第5行:使用變數「字典」的函式「get」,若找出變數「英文」對應的中文,使用函式print顯示查詢的結果到螢幕上;若沒有找到則函式get回傳「字典找不到該單字」,最後使用函式print顯示結果到螢幕上。
補充說明
(F)條件判斷與運算子「in」
可以使用條件判斷與「in」測試資料容器tuple、串列、字典與集合是否包含某個元素。(ch4\條件判斷與運算子「in」.py)
(F-1)判斷tuple是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
a = (1,2,3,4)
if 1 in a:
print('數字1在tuple a中')
else:
print('數字1不在tuple a中')
執行結果
數字1在tuple a中
(F-2)判斷串列是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
a = list('abcdefghijklmnopqrstuvwxyz')
if 'q' in a:
print('q在串列a中')
else:
print('q不在串列a中')
執行結果
q在串列a中
(F-3)判斷字典是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
lang1={'早安':'Good Morning','謝謝':'Thank You'}
if '謝謝' in lang1:
print('謝謝的英文為', lang1['謝謝'])
else:
print('查不到謝謝的英文')
執行結果
謝謝的英文為 Thank You
(F-4) 判斷集合是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
a = set('tiger')
if 't' in a:
print('t在集合a內')
else:
print('t不在集合a內')
執行結果
t在集合a內
(G) for迴圈與資料儲存容器
若要取出資料儲存容器(tuple、串列、字典與集合)的所有元素,可以使用「for」一個一個取出每一個元素,再對每一個元素進行計算。
(G-1)使用for讀取tuple
範例
t = tuple('Tuple')
for i in t:
print(i)
for i in range(0,len(t)):
print(t[i])
執行結果
T
u
p
l
e
T
u
p
l
e
說明
※t為tuple物件,內容為「'T', 'u', 'p', 'l', 'e'」。
※使用「for i in t:」,讀取t中每個元素指定給變數i。
※使用「for i in range(0,len(t)):」,i為0到t的長度減1,利用t[i]讀取t的每一個元素。
(G-2)使用for讀取串列
範例
sh = ['牛奶', '蛋', '咖啡豆']
for i in range(0,len(sh)):
print (i, sh[i])
for i, name in enumerate(sh, start=1):
print(i, name)
執行結果
0 牛奶
1 蛋
2 咖啡豆
1 牛奶
2 蛋
3 咖啡豆
說明
※sh為串列,內容為「'牛奶', '蛋', '咖啡豆'」。
※使用「for i in range(0,len(sh)):」,i為0到sh的長度減1,利用sh[i]取sh的每一個元素。
※使用「for i, name in enumerate(sh, start=1):」,函式enumerate會將sh每個元素編號,預設由0開始編號,因為「start=1」,所以修改成由1開始編號,會回傳編號與元素內容,編號指定給變數i,元素指定給變數name。
(G-3) 使用for讀取字典
範例
lang={'你好':'Hello','謝謝':'Thanks'}
for ch, en in lang.items():
print('中文為', ch, '英文為', en)
for ch in lang.keys():
print(ch,lang[ch])
for en in lang.values():
print(en)
執行結果
中文為 你好 英文為 Hello
中文為 謝謝 英文為 Thanks
你好 Hello
謝謝 Thanks
Hello
Thanks
說明
※lang為字典,內容為「'你好':'Hello','謝謝':'Thanks'」。
※使用「for ch, en in lang.items():」,使用函式items取出字典lang的「鍵」與「值」,ch對應到「鍵」而en對應到「值」,接著使用函式print印出字典lang的每一個元素的「鍵」與「值」。
※使用「for ch in lang.keys():」,使用函式keys取出字典lang的「鍵」指定給ch,使用lang[ch]取出字典的「值」,接著使用函式print印出字典lang的每一個元素的「鍵」與「值」。
※使用「for en in lang.values():」,使用函式values取出字典lang的「值」指定給en,使用en取出字典的「值」,接著使用函式print印出字典lang的每一個元素的「值」。
(H) 生成式(comprehension)與產生器(generator)
生成式可以依照規則產生資料,接著將資料儲存在串列、字典與集合內。
(H-1) 串列生成式
若要產生一個串列有5個數字,而5個數字分別是「1、2、3、4與5」,我們可以使用以下方式產生這個串列。
a = []
a.append(1)
a.append(2)
a.append(3)
a.append(4)
a.append(5)
或者使用for迴圈也可以產生此串列。
a = []
for i in range(1,6):
a.append(i)
Python提供另一種產生的方式為生成式(comprehension),比較符合Python的風格,串列生成式的語法為「[運算式 for 元素 in 可迭代的物件]」,使用「[ ]」表示為串列,可迭代的物件可以是tuple、串列、字串、字典、…與函式range等。
剛才範例使用生成式改寫後如下。
[x for x in range(1,6)]
前後使用「[]」代表是串列,這行程式可以產生一個串列,串列有5個數字,5個數字分別是「1、2、3、4與5」。
綜合前面的所有敘述,串列生成式範例1,如下表。
範例
a = []
a.append(1)
a.append(2)
a.append(3)
a.append(4)
a.append(5)
print(a)
a = []
for i in range(1,6):
a.append(i)
print(a)
a = [x for x in range(1,6)]
print(a)
程式執行結果
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
生成式也可以加上條件判斷,加上條件判斷的串列生成式格式為「[運算式 for 元素 in 可迭代的物件 if 條件判斷]」
產生一個串列,該串列元素為1到10的所有奇數數字,使用生成式可以寫成以下程式。
[x for x in range(1,11) if x%2 == 1]
生成式也可以包含另一個生成式,前面生成式執行一次,後面接的生成式要執行完畢,形成巢狀生成式,巢狀生成式的格式為「運算式 for 元素1 in 可迭代的物件1 for 元素2 in 可迭代的物件2」。
以下程式會製作九九乘法表,串列每一個元素都是tuple,紀錄九九乘法表的被乘數、乘數與積的結果。
[(i, j, i*j) for i in range(1, 10) for j in range(1, 10)]
綜合前面的所有敘述,串列生成式範例2
範例
odd = [num for num in range(1,11) if (num % 2) == 1 ]
print(odd)
i = range(1, 3)
j = range(1, 4)
mul = [(x, y) for x in i for y in j]
print(mul)
for x, y in mul:
print(x, y)
程式執行結果
[1, 3, 5, 7, 9]
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)]
1 1
1 2
1 3
2 1
2 2
2 3
(H-2) 字典生成式
除了串列生成式外,字典也可以有生成式,要在生成式中指定出「鍵」與「值」的對應,字典生成式的語法為「{ 鍵:值 for 元素 in 可迭代的物件}」,使用「{鍵:值}」表示為字典,例如:要將英文字母與該字母出現的次數製作成字典,字母為字典的「鍵」,字母出現次數為字典的「值」,就可以產生一個字典生成式如下。
word = 'elephant'
{letter : word.count(letter) for letter in set(word)}
變數word設定為字串「elephant」,使用set(word)取出字串word的每一個字母變成一個集合,集合會自動去除重複的字母,而函式word.count會計算輸入的字母letter在word出現的次數,生成式產生的字典「鍵」為letter,對應到的「值」為word.count(letter)。
綜合前面敘述,字典生成式範例,如下表。
範例
word = 'elephant'
word_count = {letter : word.count(letter) for letter in set(word)}
for w in word_count:
print(w,word_count[w])
程式執行結果
p 1
t 1
a 1
l 1
n 1
e 2
h 1
(H-3) 集合生成式
集合生成式要在生成式中指定「集合的元素」,集合生成式的語法為「{運算式 for 元素 in 可迭代的物件}」,使用「{元素}」表示為集合,例如:要將字串中的英文字母製作出一個集合,集合生成式如下。
word = 'elephant'
{letter for letter in word}
變數word設定為字串「elephant」,使用「letter for letter in word」取出字串word的每一個字母,外層的「{}」表示放到集合內,集合會自動去除重複的字母。
綜合前面敘述,集合生成式範例,如下表。
範例
word = 'elephant'
letters = {letter for letter in word}
for i in letters:
print(i)
程式執行結果
l
n
e
t
h
p
a
(H-4) 產生器(generator)
Python中沒有tuple的生成式,可以使用「(運算式 for 元素 in 可迭代的物件)」製作產生器(generator),這不是tuple生成式,使用「( )」表示為產生器。例如:製作1到10的奇數產生器,產生器為「(num for num in range(1,10) if (num % 2) == 1)」,產生器只能執行一次,執行第二次不會產生任何值。
綜合前面敘述,產生器範例,如下表。
範例
odd = (num for num in range(1,10) if (num % 2) == 1)
print(odd)
for num in odd:
print(num)
for num in odd:
print(num)
執行結果
第二次的「for num in odd:
print(num)」不會輸出任何資料,因為產生器只能使用一次。
<generator object <genexpr> at 0x00AFB9E8>
1
3
5
7
9