理解列表切片正負數
先說結論:
列表切片的格式為[start: end: step]
其中
step
代表步長,即每從start
位置開始每隔幾個元素取一個值
step
為正數時表示切片取值方向為:從左往右;為負數時:從右往左
start
,end
代表切片取值的起始和結束位置,請注意這個詞:位置,不管它們是正數還是負數,都沒有關系,它們只代表切片的區間位置而已!順着取值方向(由step
控制),start
的位置應該在end
的位置之前,否則會取不到值
現有列表:[0,1,2,3,4,5,6,7,8,9,10]
列表元素 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
正向索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
逆向索引 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
注意:上面逆向索引的初始索引,從 -1 開始
切片格式:list[start: end: step]
start: 開始位置的索引,不寫默認為列表的開頭,即索引0
end: 結束位置的索引,不寫默認為列表的末尾
step: 步長,即每個幾個元素取一個值,不寫則默認為1; 當step為正數,取值方向從左往右,當step為負數,取值方向從右往左
- 左閉右開區間
列表的切片是左閉右開區間,取值時不包含 end 索引的值:
>>> a = [0,1,2,3,4,5,6,7,8,9,10]
>>> a[0:9] # 從0開始,取值到索引9.
[0, 1, 2, 3, 4, 5, 6, 7, 8] # 但是注意:只能取值到 8,不包含索引為 9 的值
- 忽略 start 或 end
忽略 start ,則默認從索引0開始;忽略 end 位置,則截止到最后一個元素
>>> a[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 忽略start,則起始位置為開頭;忽略end,到最后結束;
# 注意:忽略 end 可以獲取列表末尾的值,不會出現左閉右開區間的問題
- step 不為1的情況
如step=2,則每從 start 開始,從左往右每隔 2 個元素取一個值
>>> a[0:9:2]
[0, 2, 4, 6, 8]
- start,end 是正數還是負數,都無所謂!它們只代表起始和結束的位置, 僅此而已!譬如下面的例子,兩者等同
>>> a[-4:-1] # 逆向的索引 [-4:-1],等同於正向的索引 [7:10]
[7, 8, 9]
>>> a[7:10]
[7, 8, 9]
- 起始位置在結束位置之后
如下面的例子,step 默認為1,取值方向從左往右;此時如果 start 在 end 位置的右邊,就取不到值
>>> a[8:0]
[]
>>> a[-2:-10]
[]
>>> a[-2:-2] # start = end,相當於原地踏步,也獲取不到值
[]
- step 負數,從右往左開始取值,如果 start 在 end 左邊,同樣也取不到值
>>> a[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] # 取值方向反了
>>> a[8:0] # step為正數,從左往右取值,此時start在end右邊,取不到值
[]
>>> a[8:0:-1] # step負數,從右往左取值,此時start在end右邊,就能取到值了
[8, 7, 6, 5, 4, 3, 2, 1]
>>> a[-2:0:-2] # -2的正向索引是9,相當於 a[9:0:-2]
[9, 7, 5, 3, 1]
>>> a[0:9:-1] # 此時取值方向是從右往左,但是 0 在 9 左邊,起始位置在結束位置之后,故取不到值
[]
擴展: range(start,stop,step)
python中的 range(start,stop,step)
也同理:
>>> list(range(1,20,-1))
[]
>>> list(range(20,1,-1))
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
>>> list(range(-1,-20,-1))
[-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19]