徹底理解Python切片

2021-08-05 19:16:28 字數 4424 閱讀 8325

徹底理解python切片

—— [ wyf部落格 ]

list#insert(ind,value)在ind元素前面插入value

首先對ind進行預處理:如果ind<0,則ind+=len(a),這樣一來ind就變成了正數下標

預處理之後,

當ind<0時,ind=0,相當於頭部插入

當ind>len(a)時,ind=len(a),相當於尾部插入

print str[0:3]      #擷取第一位到第三位的字元

print str[:] #擷取字串的全部字元

print str[6:] #擷取第七個字元到結尾

print str[:-3] #擷取從頭開始到倒數第三個字元之前

print str[2] #擷取第三個字元

print str[-1] #擷取倒數第乙個字元

print str[::-1] #創造乙個與原字串順序相反的字串

print str[-3:-1] #擷取倒數第三位與倒數第一位之前的字元

print str[-3:] #擷取倒數第三位到結尾

print str[:-5:-3] #逆序擷取

可見,列表的下標有三個引數:beg(起始下標),end(終止下標),delta(變化量)

當delta小於0時,beg預設為len(array)-1,end預設為開頭之前。

當delta大於0時,beg預設為0,end預設為最末之後。

當delta未給出時:delta預設為1

這個**示例演示了大概原理,學習一件事物,先學習它的表象,然後分析它的內在實現,最後檢視源**仔細推敲它到底是怎麼實現的。

需要注意的是,列表切片產生的是列表的副本,與原列表不是同乙份空間。

x=[1,2,3]

y=x[:]

x[0]=-1

print(y) #輸出[1,2,3]

接下來**切片的寫操作

>>> x=[1,2,3,4,5]

>>> x[2:0]=100

#在2後面插入若干個元素,應該用列表

traceback (most recent call last):

file "", line 1, in

typeerror: can only assign an iterable

>>> x[2:0]=[100]

>>> x

[1, 2, 100, 3, 4, 5]

>>>

del x[2:3] #刪除切片

>>> x

[1, 2, 3, 4, 5]

>>> x[2:1]=[100] #對於切片x[from:to],會進行預處理to=max(from+1,to)

>>> x

[1, 2, 100, 3, 4, 5]

>>>

del x[2:0] #對於切片del操作,如果from>to,不執行任何操作

>>> x

[1, 2, 100, 3, 4, 5]

>>>

del x[2:1]

>>> x

[1, 2, 100, 3, 4, 5]

>>>

del x[2:3]

>>> x

[1, 2, 3, 4, 5]

>>> x[2:4]=none

traceback (most recent call last):

file "", line 1, in

typeerror: can only assign an iterable

>>> x[2:4]=[none]

>>> x

[1, 2, none, 5]

對列表切片進行深入理解:

def

between

(beg, end, mid):

# 判斷mid是否位於begin和end之間

return end > mid >= beg or end < mid <= beg

defget_slice

(a, beg, end, delta=1):

# 陣列切片get方式

if delta == 0: raise valueerror("slice step cannot be 0")

# 將負數下標轉化一下

if beg < 0: beg += len(a)

if end < 0: end += len(a)

# 如果轉化完成之後依然不在合法範圍內,則返回空列表

if beg < 0

and end < 0

or beg >= len(a) and end >= len(a): return

# 如果方向不同,則返回空列表

if (end - beg) * delta <= 0: return

# 將越界的部分進行裁剪

beg = max(0, min(beg, len(a) - 1))

end = max(-1, min(end, len(a)))

ans =

i = beg

while between(beg, end, i):

i += delta

return ans

defset_slice

(a, li, beg, end, delta=1):

if delta == 0: raise valueerror("slice step cannot be 0")

if delta == 1:

# 如果delta==1,那麼li的長度可以隨意

if beg < 0: beg += len(a)

if end < 0: end += len(a)

beg = max(0, min(beg, len(a) - 1))

end = max(-1, min(end, len(a)))

for i in range(beg, end):

del a[beg]

for i in reversed(li):

a.insert(beg, i)

else:

# delta!=1,相當於替換

if len(get_slice(a, beg, end, delta)) != len(li): raise valueerror("array don't match")

if len(li) == 0: return

if beg < 0: beg += len(a)

if end < 0: end += len(a)

beg = max(0, min(beg, len(a) - 1))

# 用li中的全部元素逐一替換

for ind, value in enumerate(li):

a[ind * delta + beg] = value

deftest_getslice

(): a = list(range(10))

import random

for i in range(10):

beg = random.randint(-15, 15)

end = random.randint(-15, 15)

delta = 0

while delta == 0: delta = random.randint(-15, 15)

print(len(get_slice(a, beg, end, delta)) == len(a[beg:end:delta]), beg, end, delta)

deftest_setslice

():import random

for i in range(10):

a = list(range(10))

beg = random.randint(-15, 15)

end = random.randint(-15, 15)

delta = 0

while delta == 0: delta = random.randint(-5, 5)

sz = len(a[beg:end:delta])

if delta == 1: sz = random.randint(0, 4)

li = [random.randint(0, 100) for i in range(sz)]

set_slice(a, li, beg, end, delta)

mine = a

a = list(range(10))

a[beg:end:delta] = li

print(a == mine)

test_setslice()

深入理解Python切片

python序列的切片很基礎同時也很重要,最近看到乙個 1 的表達,不明所以,查了一些資料並實際操作,對python切片有了更深刻的認識,以下結合例子詳細說明。先看下切片的基本語法,一般認為切片語法是 n m 是個半閉合區間,等效於數學上 n,m 取值範圍,取n不取m,n和m都可以省略,n看下面的例...

python中對切片的理解

字串還支援 切片。索引可以提取單個字元,切片 則提取子字串 word 0 2 characters from position 0 included to 2 excluded py word 2 5 characters from position 2 included to 5 excluded...

徹底理解Python中的yield

閱讀別人的python原始碼時碰到了這個yield這個關鍵字,各種搜尋終於搞懂了,在此做一下總結 通常的for.in.迴圈中,in後面是乙個陣列,這個陣列就是乙個可迭代物件,類似的還有鍊錶,字串,檔案。它可以是mylist 1,2,3 也可以是mylist x x for x in range 3 ...