徹底理解python切片list#insert(ind,value)在ind元素前面插入value—— [ wyf部落格 ]
首先對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 ...