狠狠撸

狠狠撸Share a Scribd company logo
Python串列資料應用
Revised on March 21, 2020
? 串列資料結構
? 串列的內建函式
? 串列的方法
? 串列的運算子
? 字串與串列轉換
? 串列的排序作業
? 二維串列
? 應用實例:撲克牌梭哈遊戲
? 程式使用變數來儲存運算資料級及結果,當程式需要運算多筆資料時
(5位學生的測驗成績),若個別以變數宣告,必須宣告5個int整數變
數來儲存這5個成績:
quiz1 = 71
quiz2 = 83
quiz3 = 67
quiz4 = 49
quiz5 = 59
? 如果是50位學生的成績,我們需要50個變數;如此使得程式碼維護變
得相當麻煩
? 觀察上述測驗成績的5個變數,其擁有的共同特性:
? 變數有循序性,擁有順序的編號1~5
? 變數的資料型態相同都是int
串列資料 1/7
2
? 我們可以將5個成績變數集合起來,使用?個名稱quizzes代表:
quizzes = [71, 83, 67, 49, 59]
? 串列(List)如同是排成?列的箱子,每?個箱子可儲存?筆資料,稱
為「元素 (Element)」,以此例quizzes串列內有5個元素,每個元
素是單?值,稱為?維串列
串列資料 2/7
71
83
67
49
59
索引
0
1
2
3
4
3
? Python串列資料(list)類似其它程式語言的陣列資料(array),但串
列元素允許是不同資料型別
? 串列名稱 = [元素1, 元素2, 元素3, …]
quizzes = [71, 83, 67, 49, 59] #整數串列
fruit = ['appl', 'orange', 'melon'] #字串串列
price = ['apple', 17, 'orange', 23] #不同資料型別組成之串列
mylist = [] #空串列
? 串列使用索引值(Index)來存取串列元素,索引值從0開始,不得超出
串列範圍
print (quizzes[0]) #71
? 索引值可以是負數,-1表?最後?個元素,-2表?倒數第二個元素,
?樣不能超過串列範圍
print (quizzes[-1]) #59
串列資料 3/7
4
? 冒號運算子用來取得串列資料的子串列或元素(slicing語法)
? [start:end]
從start到end-1
? [start:end:increment]
從start到end-1,遞增取值
? [start:end:decrement]
從start到end+1,遞減取值
串列資料 4/7
5
#-2表示倒數第二個元素
? 字串資料可視為字元串列處理
串列資料 6/7
6
? 串列在建立時已存放有元素的初值,但如同變數?樣,允許更新元素
內容:
? 串列名稱[索引] = 資料
串列資料 7/7
? 串列的元素可以是另?個串列,形成多維串列
employee = [["joe", 23], ["mary", 21], ["david", 22]]
? 允許每?維元素為不規則
? 多維串列元素的存取是使用多個中括號索引組合
print(employee[1]) #["mary", 21]
print(employee[1][1]) #21
? del list[n1:n2]
刪除list串列n1到n2-1元素
? del list[n1:n2:n3]
刪除list串列n1到n2-1元素,刪除間隔為n3
串列資料 5/7
8
? len(list)
取得串列元素數目
? min(list)
取得list串列中最小的元素值
? max(list)
取得list串列中最大的元素值
? sum(list)
計算list串列元素的總和
? sorted(list)
回傳?個由小到大排序的list,並不會改變原來的串列資料
串列的內建函式 1/2
串列的內建函式 2/2
? list.append(n1)
將n1加到list串列最後,n1可以是元素或串列
? list.clear()
刪除串列所有的元素
? list.count(n1)
n1元素在list串列中出現的次數
? list.extend(list2)
將list2加到list串列最後
? list.index(n1)
list串列中第1個n1元素的索引值
串列的方法 1/3
? list.insert(n, n1)
在listl串列位置n插入n1元素
? list.pop(n)
從list串列取出位置n元素,並將n1自list串列中移除;省略參數n
表?最後?個元素
? list.remove(n1)
從list串列移除第?個n1元素
? list.reverse()
反轉串列順序
? list.sort()
將串列由小到大排序
串列的方法 2/3
串列的方法 3/3
13
? in
判斷指定資料是否存在於串列中
? not in
判斷指定資料是否不存在於串列中
? =
複製串列
? +
連結兩個串列
? *
複製串列元素
串列的運算子 1/2
串列的運算子 2/2
? 字串資料可使用spilt()方法分割為字串串列
字串串列 = 字串.split(切割字元, 分割次數)
? 預設使用空字元(空格、换行n或跳格t)做為切割字元
? 分割次數,預設為-1,表?全部分割
字串與串列轉換 1/2
? 將字串串列的元素可使用join方法,連接成?個?字串
字串 = '連結字元'.join(字串串列)
字串與串列轉換 2/2
? 串列的元素,可以按資料值由小到大的排列方式,重新安排元素順序
? 串列名稱.sort() #將串列元素由小到大排列
? 串列名稱.sort(reverse = True) #將串列元素由大到小排列
? 串列的元素,可以按反方向重新排列元素的順序
? 串列名稱.reverse()
串列的排序 1/2
? 使用sort()方法排序串列,是採就地排序方式,串列經排序後會失去
原有的排列順序。若要有排序後的結果,又要保有排序前的原貌,就
得使用sorted()函式來複製串列並排序
新串列 = sorted(串列名稱, reverse = True|False)
? reverse = True,進行由大到小排序;reverse = False,進行由小到
大排序
串列的排序 2/2
? 排序是資料處理上常用的技術,如果程式語言未內建排序方法時,就
只能自行依據排序演算法撰寫排序程式
? 氣泡排序法是最常?的?種排序演算法
? 氣泡排序法是採用兩相鄰串列元素的元素值做比較,若是做遞增排列
時,元素值較小者排前面,元素值較大者排後面
? 處理的方式是由左而右進行兩兩比較,當左邊元素的元素值比右邊元素的
元素值大時,即進行交換工作
? 在第?次排序時,元素值最大的元素會移到最右邊;第二次排列時,元素
值第二大的元素移到最右邊算過來的第二位;以此類推…
? 氣泡排序法的排列次數,是串列元素個數減1。而每次排列的比較次數,
是參加排序的元素數減1。每?次排列比較後,會有?個元素值被放?正
確的元素位置
氣泡排序法 1/6
氣泡排序法 2/6
? 例如有五個元素的串列以氣泡排序法排列,會需要排列4次(5-1),比較次
數為10次(4+3+2+1)
4 15 20 13 6
氣泡排序法 3/6
4 15 20 13 6
不用換
不用換
4 15 20 13 6
交換
4 15 13 20 6
交換
4 15 13 6 20
? 第?次排序
? 第二次排序
4 15 13 6 20
氣泡排序法 4/6
4 15 13 6 20
不用換
4 13 15 6 20
交換
4 13 6 15 20
交換
? 第三次排序
4 13 6 15 20
氣泡排序法 5/6
4 13 6 15 20
不用換
4 6 13 15 20
交換
? 第四次排序
4 6 13 15 20
氣泡排序法 6/6
不用換
4 6 13 15 20
? 二維串列的註標有兩組,第?組註標稱為「列」(row),第二組註標
稱為「行」(column)
? 凡是能以表格方式呈現的資料,都可以使用二維串列,如:座位表、
課表
? 二維串列中,每?列的個數沒有限定要相同
? 二維串列中若每?列的個數都相同,就構成了?個矩陣串列
二維串列 1/4
? 建立二維陣列的方式
? 直接建立
串列名稱 = [[元素00, 元素01, 元素02, ...],
[元素10, 元素11, 元素12, ...],
[元素20, 元素21, 元素22, ...],
...]]
test1 = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
? 使用列表生成
m = n = 3
test2 = [[0 for i in range(m)] for j in range(n)]
二維串列 2/4
? 不規則二維陣列
test3 = [[] for i in range(3)]
test3[0] = [1, 2, 3]
test3[1] = [4, 5]
test3[2] = [6, 7, 8, 9]
二維串列 3/4
二維串列 4/4
? 每位玩家發5張牌,自動分析玩家手牌內容,顯?手牌內容及梭哈牌型
Lab 撲克牌梭哈(show hand)遊戲 1/12
30
牌型 說明 舉例
同花順
Straight Flush
五張同樣花色的並連續數字 紅心A、紅心2、紅心3、紅心4、紅心5
鐵支
Four of a Kind
五張牌中有四張同樣數字的牌 紅心A、黑桃A、磚塊A、梅花A、梅花2
胡蘆
Full house
五張牌中有三張同樣數字與兩張同樣數字的牌 紅心A、黑桃A、磚塊A、梅花2、梅花2
同花
Flush
五張同樣花色的牌 紅心A、紅心8、紅心9、紅心J、紅心K
順子
Straight
連續數字的五張牌 紅心A、黑桃2、紅心3、紅心4、梅花5
三條
Three of a Kind
五張牌中有三張同樣數字的牌 紅心A、黑桃A、梅花A、紅心3、紅心4
兩對
Two Pairs
五張牌中有各有兩張同樣數字的牌 紅心A、黑桃A、紅心K、黑桃K、紅心2
一對
One Pair
五張牌中有二張同樣數字的牌 紅心A、黑桃A、紅心3、紅心4、紅心5
散牌
High card
五張牌花色、數字皆不相同,並數字不連續 紅心A、黑桃8、紅心9、紅心J、紅心10
Lab 撲克牌梭哈(show hand)遊戲 2/12
? 設定玩家入數
player = int(input('輸入玩家人數:'))
? 撲克牌花色串列
suits = ['黑桃','紅心','方塊','方塊']
? 建立撲克牌組
//建立deck串列,元素值0~12表?黑桃,13~25表?紅心,26~38表?方塊,39~51表?梅花
deck = []
for i in range(0, 52):
deck.append(i)
? 洗牌
random.shuffle(deck)
Lab 撲克牌梭哈(show hand)遊戲 3/12
0 1 2 3 ... 50 51
32
deck[]
? 建立show_card()副程式,用來顯?撲克牌
def show_card(card):
suit = card//13 #花色
print(' %s'%(suits[suit]), end='')
number = card%13 #牌值
if (number==0): print('A', end='')
elif(number==10): print('J', end='')
elif(number==11): print('Q', end='')
elif(number==12): print('K', end='')
else: print(number+1, end='')
? 測試
show_card(14)
Lab 撲克牌梭哈(show hand)遊戲 4/12
33
? 發牌,每人發5張牌
//建立card二維串列,用來記錄玩家的撲克牌
card = [[] for i in range(0,player)] #二維串列,用來記錄玩家手牌
k=0
for i in range(0, 5):
for j in range(0, player):
card[j].append(deck[k])
k+=1
Lab 撲克牌梭哈(show hand)遊戲 5/12
34
player
card[[]] int int int int int
int int int int int
int int int int int
? 統計玩家手牌之牌值
//建立rank二維串列,用來統計玩家各牌值撲克牌之張數,ACE牌可算1或14
rank = [[0 for i in range(14)] for j in range(player)]
for i in range(0, player):
for j in range(0, 5):
rank[i][card[i][j]%13] += 1
rank[i][13]=rank[i][0] //ACE牌也可當14點
Lab 撲克牌梭哈(show hand)遊戲 6/12
player
rank[[]] int int ... int
int int ... int
int int ... int
14
35
? 檢查梭哈牌型:同花
#建立flush串列,用來記錄玩家的撲克牌是否為同花
flush = [False for i in range(player)]
#檢查玩家5張牌是否相同花色
for i in range(player):
flush[i] = (card[i][0]//13==card[i][1]//13==card[i][2]//13==card[i][3]//13==
card[i][4]//13)
Lab 撲克牌梭哈(show hand)遊戲 7/12
36
_Bool _Bool ... _Bool
player
flush[]
? 檢查梭哈牌型:順子
#建立straight串列,用來記錄玩家的撲克牌是否為順子
straight = [False for i in range(player)]
#檢查玩家5張牌值是否為連續
for i in range(player):
for j in range(0, 10):
if (rank[i][j]==0): continue
for k in range(1, 5):
if (rank[i][j+k]==0): break
if (k==4):
straight[i]=True
Lab 撲克牌梭哈(show hand)遊戲 8/12
37
_Bool _Bool ... _Bool
player
straight[]
player
rank[[]] int int ... int
int int ... int
int int ... int
14
? 統計玩家牌型組合
#建立count二維串列,用來統計玩家撲克牌中之相同牌值情形
#count[2]==1表??對;count[2]==2表?兩對;count[3]==1表?三條;count[4]==1表?鐵支
count = [[0 for i in range(5)] for j in range(player)]
for i in range(player):
for j in range(13):
count[i][rank[i][j]]+=1
Lab 撲克牌梭哈(show hand)遊戲 9/12
38
player
rank[[]] int int ... int
int int ... int
int int ... int
14
? 建立show_hand()副程式,用來顯?梭哈牌型
def show_hand(player):
if(flush[player] and straight[player]):
print("同花順n")
return
if(count[player][4]==1):
print("鐵支n")
return
if(count[player][3]==1 and count[player][2]==1):
print("葫蘆n")
return
if(flush[player]):
print("同花n")
return
if (straight[player]):
print("順子n")
return
Lab 撲克牌梭哈(show hand)遊戲 10/12
39
if(count[player][3]==1):
print("三條n")
if(count[player][2]==2):
print("兩對n")
if(count[player][2]==1):
print("?對n")
if(count[player][1]==5):
print("散牌n")
Lab 撲克牌梭哈(show hand)遊戲 11/12
40
? 顯?每位玩家之手牌及梭哈牌型
for i in range(player):
print('第%d位玩家:'%(i+1))
for j in range(5): #顯?玩家手牌內容
show_card(card[i][j])
print('n 梭哈牌型:', end='')
show_hand(i) #顯?玩家手牌梭哈牌型
Lab 撲克牌梭哈(show hand)遊戲 12/12
41
? colors串列中有256個顏色值,若要分割這個串列,使顯?由第2個顏色值開
始,間隔3個顏色值後再顯?下?個顏色值,直到最後,則下列何者正確?
A. colors[2::4]
B. colors[1::4]
C. colors[::3]
D. colors[1::3]
自我評量 1/7
? emp串列中有150名員工姓名,最後10名為臨時員工,若要顯?不含臨時員工
的員工姓名,則下列何者正確?
A. emp[0:-9]
B. emp[1:-10]
C. emp[:-10]
D. emp[:-9]
自我評量 2/7
? 下列程式碼,執行後輸出值為何?
arr1 = [11, 22]
arr2 = [33, 44]
arr3 = arr1 + arr2
arr4 = arr3 * 2
print(arr4)
A. [[22, 44],[66, 88]]
B. [22, 44, 66, 88]
C. [[11, 22], [33, 44], [11, 22], [33, 44]]
D. [11, 22, 33, 44, 11, 22, 33, 44]
自我評量 3/7
? A為可儲存n筆整數的串列
A = […,…,…,……]
p = A[0]
q = A[0]
for I in range(n):
if A[i]>p:
p = A[i]
if A[i]<q:
q = A[i]
程式碼運算後,下列何者錯誤
A. p是A串列資料中的最大值
B. q是A串列資料中的最小值
C. q<p
D. A[0]<=p
自我評量 4/7
? 下列程式執行後,輸出為何?
arr = [y for y in range(10)]
sum = 0
for i in range(1, 9)
sum = sum – arr[i-1] + arr[i] + arr[i+1]
print(sum)
A. 44
B. 52
C. 54
D. 63
自我評量 5/7
? 執行下列程式,若依序輸入整數0,1,2,3,4,5,6,7,8,9
arr = [0 for x in range(10)]
for i in range(10):
arr[(i+2)%10] = eval(input())
則arr串列內容為何
A. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
B. [2, 0, 2, 0, 2, 0, 2, 0, 2, 0]
C. [9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
D. [8, 9, 0, 1, 2, 3, 4, 5, 6, 7]
自我評量 6/7
? 執行下列程式,輸出為何?
for i in range(1, 5):
A[i] = 2 + i * 4
B[i] = i * 5
C = 0
for i in range(1, 5):
if B[i]>A[i]:
C = C + (B[i] % A[i])
else:
C = 1
print(C)
A. 1
B. 4
C. 3
D. 333
自我評量 7/7

More Related Content

Python程式設計 - 串列資料應用