2017年10月18日 星期三

Python 研究slice的用法

假設我們有一個長度為8的陣列a,其編號與對應到得值分別如下表。
a = [10, 20, 30, 40, 50, 60, 70, 80]

編號0 1 2 3 4 5 6 7
10 20 30 40 50 60 70 80
以往我們存取陣列的數值常常都是透過編號的方式,例如a[1]的值就是20。在python內可以使用一種更強大且方便的工具來操作陣列。

存取陣列內元素

slice的用法就是在中括號[]內加入冒號:,形式長這樣a[i:j]這是什麼意思呢?i為我要存取之陣列起始編號j為陣列之結束編號。就是我要存取a陣列當中的從編號i到編號j的元素。注意,它是包含i,不包含j的。用數學的表示方式大概就是[i, j)。i, j如果有沒值的話就是代表該陣列的起始點結束點

用四個小範例來展示一下更加清楚。

a = [10, 20, 30, 40, 50, 60, 70, 80]

print "#1", a
#1: 單純先把陣列印出來看看
print "#2", a[:]
#2: 不給i, j值,就是分別為0跟8的意思。所以一樣是印出陣列的全部值
print "#3", a[1:3]
#3: 印出編號[1, 3)的兩個元素
print "#4", a[5:len(a)]
#4: 印出第5個到第7個元素(len(a)為8)

---result---
#1 [10, 20, 30, 40, 50, 60, 70, 80]
#2 [10, 20, 30, 40, 50, 60, 70, 80]
#3 [20, 30]
#4 [60, 70, 80]
其他i, j也可以為負的,在此先不討論,不過原理大致相同。

用slice插入元素

有時候我想要在陣列的前後插入,該怎麼辦呢?一般通常會使用insert這功能,但也可以透過slice來完成。

例如

a[len(a):] = [90, 100, 110]
print "#5", a
#5: 我想要在a陣列後方插入90, 100, 110這三個值,所以我在冒號的左邊,也就是起始位置i設為len(a),也就是8。代表我要從第8個位置放入90, 100, 110
a[:0] = [7, 8, 9]
print "#6", a

#6: 如果要在陣列前面插入值的話,那就指定j值為0,表示我要插入的值會放在第0個位置之前。
a[3:4] = [10, 11, 12]
print "#7", a

#7: 我想要在10跟20中間放些值進去,此時10與20對應到的編號分別已經變為3, 4了,所以就是就在[3:4]中插入值。注意,3的位置的值會被取代,所以要把數值10也放入其中。

---result---
#5 [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]
#6 [7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]
#7 [7, 8, 9, 10, 11, 12, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]

沒有留言:

張貼留言