Python小白的切片練習101

Python切片的基本語法

sequence[start:stop]
sequence[start:stop:step]
  • 通過給定的索引區間獲得線性結構的一部分數據
  • start、stop、step爲整數,可以是正整數、負整數、零
  • start爲0時,可以省略 stop爲末尾時,可以省略 step爲1時,可以省略
  • 切片時,索引超過上界(右邊界),就取到末尾;超過下界(左邊界),取到開頭
x = range(90,100)
x
range(90, 100)
x[:]
range(90, 100)
x[:-1]
range(90, 99)
x[0:]
range(90, 100)
x[3:]
range(93, 100)
x[3:-1]
range(93, 99)
x[9:-1]
range(99, 99)
x[:100]
range(90, 100)
x[-100:]
range(90, 100)
x[4:-2]
range(94, 98)
x[-4:-2]
range(96, 98)

字符串和byte同樣可以切片

print("9876543210"[-4:8])
32
print(b"9876543210"[-4:8])
b'32'

Python切片的步長

x = range(0,10)
x
range(0, 10)
x[::]
range(0, 10)
x[::2]
range(0, 10, 2)
x[2:8:3]
range(2, 8, 3)
x[:9:3]
range(0, 9, 3)
x[1::3]
range(1, 10, 3)
x[-10:8:2]
range(0, 8, 2)

Python切片的起止和方向控制

  • 在序列上使用切片[start:stop],子區間索引範圍[start, stop),相當於從start開始指向stop的方向上獲 取數據
  • 默認step爲1,表示向右;步長爲負數,表示向左
  • 如果子區間方向和步長方向不一致,直接返回當前類型的"空對象"
  • 如果子區間方向和步長方向一致,則從起點間隔步長取值
x = [0,1,2,3,4,5,6,7,8,9,]
print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
x[-10:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
x[-5:-6]
[]
x[6:5]
[]
x[5:5]
[]
x[1:9:-2]
[]
x[::-2]
[9, 7, 5, 3, 1]
x[8::-2]
[8, 6, 4, 2, 0]
x[8:-10:-2]
[8, 6, 4, 2]
x[8:-10:-2]
[8, 6, 4, 2]
x[-5:4:-1]
[5]
x[-5:5:-1]
[]

切片包前不包後

t = [0,50,2,3,4]
t[1:2]
[50]

我們簡單看一下切片有哪些實用的應用場景:

  • 用切片倒序輸出,因爲是按照索引取值,時間複雜度爲O(1),所以是節省內存的輸出方法,例如
x = range(6)
x
range(0, 6)
for i in range(-1, -len(x)-1, -1):
    print(x[i])
5
4
3
2
1
0

如上倒序輸出寫法等價於:

for z in x[::-1]:
    print(z)
5
4
3
2
1
0
  • 我們還可以使用切片完成copy,例如:

  • 實際上切片後得到一個全新的對象。 [:] 或 [::] 相當於copy方法,即相當於淺拷貝。

x= [1,2,3,4,5,6]
x
[1, 2, 3, 4, 5, 6]
y = x[:]
print(id(x),id(y))
2973248551304 2973249530440
x = [[1]]
y = x[:]
x[0][0]=100
y # 因爲是淺拷貝,y的[0][0]個元素也自動變成了100
[[100]]
x ==y
True

上例可知,實際上切片後得到一個全新的對象。 [:] 或 [::] 相當於copy方法。

y 和 x它們兩個變量指向同一個對象。
y=[]、y[:]=x等價於 z=x[:],都是創建x的副本。 切片賦值用作初始化相當於copy,還可以使用。如果用在替換、插入元素,看似語法比較簡潔,但是由於列表是順序表結構,將會引起數據的挪動,這非常影響性能,應當儘量避免使用。

  • 用切片進行賦值:
    切片操作寫在了等號左邊,被插入的可迭代對象寫在等號右邊
x = [0, 1, 2, 3, 4]
z = list()
z[:]=x
z[1:2]=10 #注意這裏是不可以的,因爲右邊必須是可迭代對象iterable
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-88-baac5eba4b45> in <module>
      2 z = list()
      3 z[:]=x
----> 4 z[1:2]=10 #注意這裏是不可以的,因爲右邊必須是可迭代對象iterable


TypeError: can only assign an iterable
z[1:2]=(111,)
z
[0, 111, 2, 3, 4]
z[2:]=(222,)
z
[0, 111, 222]
z[1:] = (40, 50 ,60, 70) 
z
[0, 40, 50, 60, 70]
t[1:] = range(10,20)
t
[0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

今日雞湯:一個人水平有多高,取決於基礎有多麼紮實

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章