3.Python 資料容器
引用自中山女高 黃建庭老師的教學網站
Python資料儲存容器tuple-串列-字典-集合
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顯示結果到螢幕上。