SlideShare 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

PDF
Parser combinatorってなんなのさ
PDF
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...
PPTX
機器學習簡報 / 机器学习简报 Machine Learning
PDF
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
PDF
Python入門
PDF
WeTestAthens: Postman's AI & Automation Techniques
PDF
基礎からのCode Contracts
PPTX
20210831 code night はじめての強化学習
Parser combinatorってなんなのさ
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...
機器學習簡報 / 机器学习简报 Machine Learning
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
Python入門
WeTestAthens: Postman's AI & Automation Techniques
基礎からのCode Contracts
20210831 code night はじめての強化学習

What's hot (20)

PDF
Pythonによる機械学習
PDF
多倍長整数の乗算と高速フーリエ変換
PPTX
SSII2020SS: グラフデータでも深層学習 〜 Graph Neural Networks 入門 〜
PPTX
固有表現抽出について
PPTX
OSS強化学習フレームワークの比較
PPTX
shared_ptrとゲームプログラミングでのメモリ管理
PDF
ソフトウェアエンジニアに知ってほしいAerospike
PDF
転置インデックスとTop k-query
PDF
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
PDF
中3女子でもわかる constexpr
PDF
Python interview questions
PDF
プログラムを高速化する話
PDF
Pythonではじめる OpenAI Gymトレーニング
PPTX
地獄のElixir(目黒スタートアップ勉強会)
PPTX
[DL輪読会]Image-to-Image Translation with Conditional Adversarial Networks
PDF
AI-first Code Editor 「Cursor」の機能紹介
PPTX
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
PDF
1時間で分かるSTA (Software Test Automation) #stac2014
PDF
高速フーリエ変換
PDF
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
Pythonによる機械学習
多倍長整数の乗算と高速フーリエ変換
SSII2020SS: グラフデータでも深層学習 〜 Graph Neural Networks 入門 〜
固有表現抽出について
OSS強化学習フレームワークの比較
shared_ptrとゲームプログラミングでのメモリ管理
ソフトウェアエンジニアに知ってほしいAerospike
転置インデックスとTop k-query
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
中3女子でもわかる constexpr
Python interview questions
プログラムを高速化する話
Pythonではじめる OpenAI Gymトレーニング
地獄のElixir(目黒スタートアップ勉強会)
[DL輪読会]Image-to-Image Translation with Conditional Adversarial Networks
AI-first Code Editor 「Cursor」の機能紹介
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
1時間で分かるSTA (Software Test Automation) #stac2014
高速フーリエ変換
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
Ad

Similar to Python程式設計 - 串列資料應用 (20)

PDF
Python串列資料應用
PDF
PDF
Ch5 教學
PDF
PDF
PDF
Ch4 教學
PPTX
ncuma_串列.pptx
PDF
Ppt 51-77
PDF
Ppt 51-77
PDF
Ppt 78-100
PDF
Ppt 78-100
PPTX
20161209-Julia Taiwan first meetup-julia語言入門
PDF
手把手打開Python資料分析大門
PDF
Python系列2
PDF
[系列活動] 手把手打開Python資料分析大門
PDF
Ch4 範例
PDF
Python變數與資料運算
PDF
PDF
Python系列3
PDF
Python串列資料應用
Ch5 教學
Ch4 教學
ncuma_串列.pptx
Ppt 51-77
Ppt 51-77
Ppt 78-100
Ppt 78-100
20161209-Julia Taiwan first meetup-julia語言入門
手把手打開Python資料分析大門
Python系列2
[系列活動] 手把手打開Python資料分析大門
Ch4 範例
Python變數與資料運算
Python系列3
Ad

More from 吳錫修 (ShyiShiou Wu) (20)

PDF
mbot2.0教學-陀螺儀與三軸加速計應用.pdf
PDF
mbot2.0教學-使用makeblock雲服務.pdf
PDF
mbot2.0教學-局域網路傳輸應用.pdf
PDF
mbot2.0教學-四路顏色感測器應用.pdf
PDF
mbot2.0教學-聲光控制應用.pdf
PDF
mbot2.0教學-光感測器與LED應用.pdf
PDF
mbot2.0教學-超音波感測應用.pdf
PDF
mbot2.0教學-移動控制.pdf
PDF
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
PDF
mbot2.0教學-組裝與測試.pdf
PDF
Python元組,字典,集合
PDF
PDF
Python 迴圈作業
PDF
Python分支作業
PDF
Python基本資料運算
PDF
建置Python開發環境
PDF
micro:bit加速度感測應用
PDF
C語言檔案處理
PDF
C語言列舉與聯合
PDF
C語言結構與串列
mbot2.0教學-陀螺儀與三軸加速計應用.pdf
mbot2.0教學-使用makeblock雲服務.pdf
mbot2.0教學-局域網路傳輸應用.pdf
mbot2.0教學-四路顏色感測器應用.pdf
mbot2.0教學-聲光控制應用.pdf
mbot2.0教學-光感測器與LED應用.pdf
mbot2.0教學-超音波感測應用.pdf
mbot2.0教學-移動控制.pdf
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
mbot2.0教學-組裝與測試.pdf
Python元組,字典,集合
Python 迴圈作業
Python分支作業
Python基本資料運算
建置Python開發環境
micro:bit加速度感測應用
C語言檔案處理
C語言列舉與聯合
C語言結構與串列

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