首先你要理解什麼是分片,也有的書叫切片(slice)。當你需要乙個序列的子串的時候,你就可以使用切片操作
a = ['a','b','c','d','e','f','g']
在a這個序列中,如果你想擷取裡面['c','d','e']這個子串行,那麼你就可以使用切片a[2:5]
它的語法形式是a[start:end],這裡有乙個區間邊沿取值的問題。首先你要明確序列的索引是從0開始的,a[2:5]取值的範圍是[2,5),前面是閉區間,後面是開區間,也就是2<=索引值<5這段區間裡的元素。所以如果這樣來切的話:a[1:1],得到的就是,空序列。試問在序列a中,**有元素的索引是既》=1又<1的呢?
上面切片出來出來(a[2:5])的值是['c','d','e']。但是它返回的並不是乙個值,而是乙個引用,換句話說,a[2:5]之後所得到的子串行,如果你對它進行修改
那麼它的修改就會反饋到原來的序列當中,你可以嘗試一下:
a[2:5] = ['x','y','z']
print a
a = ['a','b','x','y','z','f','g']
你對切片進行賦值已經反映到源序列當中。但是,如果我不賦值三個元素,我賦值兩個,或者四個,那會發生什麼情況呢?
看看下面的**:
>>> a = ['a','b','c','d','e','f','g']
>>> a[2:5] = ['1','2']
>>> print a
['a', 'b', '1', '2', 'f', 'g']
>>> a = ['a','b','c','d','e','f','g']
>>> a[2:5] = ['1','2','3','4']
>>> print a
['a', 'b', '1', '2', '3', '4', 'f', 'g']
答案顯而易見,就算你賦值元素個數和原來切片出來元素的個數不一樣,它所反映到源序列的都是['c','d','e']這個子串行被改變。
也就是:a[2:5] = ['1','2']之後得到的不是想當然的['a', 'b', '1', '2', 'e','f', 'g']而是,['a','b','1','2','f','g']
如果你把乙個空序列賦值給切片物件a[2:5] = ,那麼反映到序列中的就是2<=索引<5的元素被刪除了。和上面一樣,再來看看**,算是作為結束:
>>> a = ['a','b','c','d','e','f','g']
>>> a[2:5] =
>>> print a
>>> ['a','b','f','g']
>>> print len(a)
>>> a = ['a','b','c','d','e','f','g']
>>> print len(a)
>>> a[2:5] = ['1','2','3','4','5','6','7']
>>> print a
['a', 'b', '1', '2', '3', '4', '5', '6', '7', 'f', 'g']
>>> print len(a)
我還想說說幾種切片的方法,因為它們實在太有趣了。
上面我們用到的索引一直都是正值,但是在python中,序列的索引值可以是負值。從最後乙個元素索引開始計算,分別是-1,-2,-3,.....
我想換個字串來測試,不要再abcd,1234的了。就用segmentfault.com吧!
>>> a = list('segmentfault.com')
>>> print a
['s', 'e', 'g', 'm', 'e', 'n', 't', 'f', 'a', 'u', 'l', 't', '.', 'c', 'o', 'm'] #最後乙個'm'的索引是-1,然後依次向前遞減
>>> print a[-16:-4]
['s', 'e', 'g', 'm', 'e', 'n', 't', 'f', 'a', 'u', 'l', 't']
要注意區間的選取。-16<=索引值
除此之外,我還可以在'segmentfault'中每隔兩個字元地將擷取到的字元組成序列。試試:
>>>print a[-16:-4:3]
>>>['s', 'm', 't', 'u'] #隔了兩個字元
在這裡的3被稱作步進值,步進切片的語法形式就是:seq[start:end:step],在start<=索引值= 1)。
而且,這個步進值同樣可以是負數,對應的形式就是seq[end:start:step],在start<=索引值
所以a[-4:-16:-3]的意思就是:反方向從-16<=索引值
所以當你想要把這個序列反轉的時候,你就可以從反方向擷取所有元素a[::-1]。
通過這幾種方法切片出來的物件,你都可以進行賦值,具體的你就自己嘗試一下吧!
總結一下:
當step為正值的時候,seq[start:end:step]表示的是在seq中,每隔step-1個字元,擷取start<=索引值
當step為負值的時候,seq[end:start:step]表示的是在seq中,每隔|step|-1個字元,擷取start<=索引值
注意是從哪邊開始!
這樣看還是挺混亂的,關鍵還是多練!
ps:時間很緊,下午還要考試,可能會有錯誤。所以還是以官方文件和書本的為準吧。我的python版本是2.7.3。
關於Python分片
coding utf 8 定義乙個字串 stra str123ab print stra 結果 str123ab 定義乙個元祖 tupleb str 1,2,3,a b print tupleb 結果 str 1,2,3,a b 定義乙個列表 listc str 1,2,3,a b print li...
python分片處理 python分片
進行分片的時候,分片的開始和結束點需要進行指定 不管是直接還是間接 而另外乙個引數 在python 2.3 加入到內建型別 步長 step length 通常都是隱式設定的。在普通的分片中,步長是1 分片操作就是按照這個步長逐個遍歷序列的元素,然後返回開始和結束點之間的所有元素。numbers 0 ...
python分片的步長 Python的分片操作
在列表中有一種操作叫做分片 一般形式 l2 4,6,1,7,9 e l2 2 4 print e 該 執行結果如下 1,7 從下標來看可以很容易的知道下標二對應的正好是元素3,值1 但是,卻沒有下標4的元素5,值9 所以,我們得出乙個結論 python的分片操作含左不含右 操作範圍 m,n 實際範圍...