Python當中的slice用法

title: how to use slice in python
tags: python


假設我們有一個長度為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如果有沒值的話就是代表該陣列的起始點與結束點。

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

  • #1: 單純先把陣列印出來看看
  • #2: 不給i, j值,就是分別為08的意思。所以一樣是印出陣列的全部值
  • #3: 印出編號[1, 3)的兩個元素
  • #4: 印出第5個到第7個元素(len(a)為8)
1
2
3
4
5
6
7
8
9
10
11
12
a = [10, 20, 30, 40, 50, 60, 70, 80]

print "#1", a
print "#2", a[:]
print "#3", a[1:3]
print "#4", a[5:len(a)]

---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來完成。

再舉三個例子

  • #5: 我想要在a陣列後方插入90, 100, 110這三個值,所以我在冒號的左邊,也就是起始位置i設為len(a),也就是8。代表我要從第8個位置放入90, 100, 110
  • #6: 如果要在陣列前面插入值的話,那就指定j值為0,表示我要插入的值會放在第0個位置之前。
  • #7: 我想要在1020中間放些值進去,此時1020對應到的編號分別已經變為3, 4了,所以就是就在[3:4]中插入值。注意,3的位置的值會被取代,所以要把數值10也放入其中。
1
2
3
4
5
6
7
8
9
10
11
12
13
a[len(a):] = [90, 100, 110]
print "#5", a

a[:0] = [7, 8, 9]
print "#6", a

a[3:4] = [10, 11, 12]
print "#7", a

---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]