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顯示結果到螢幕上。