Python切片操作是Python中從列表乡括,字符串等某個序列對象中抽取部分值的情況下使用的方法粥烁,首先我們要知道序列對象包括哪些類型栋豫。
序列:字符氯葬、列表、元組 ??
? 所有序列都支持迭代捅暴,序列表示索引為非負整數的有序對象集合恬砂,字符和元組屬于不可變序列,列表可變蓬痒。
Python切片操作的一般方式
一個完整的切片表達式包含兩個“:”泻骤,用于分隔三個參數(start_index、end_index梧奢、step)狱掂,當只有一個“:”時,默認第三個參數step=1亲轨。
切片操作基本表達式:object[start_index:end_index:step]
step:正負數均可趋惨,其絕對值大小決定了切取數據時的‘‘步長”,而正負號決定了“切取方向”惦蚊,正表示“從左往右”取值器虾,負表示“從右往左”取值。當step省略時蹦锋,默認為1兆沙,即從左往右以增量1取值≡畏啵“切取方向非常重要挤悉!
start_index:表示起始索引(包含該索引本身);該參數省略時巫湘,表示從對象“端點”開始取值,至于是從“起點”還是從“終點”開始昏鹃,則由step參數的正負決定尚氛,step為正從“起點”開始,為負從“終點”開始洞渤。
end_index:表示終止索引(不包含該索引本身)阅嘶;該參數省略時,表示一直取到數據“端點”载迄,至于是到“起點”還是到“終點”讯柔,同樣由step參數的正負決定,step為正時直到“終點”护昧,為負時直到“起點”魂迄。
下面說下實際的使用案例,以列表為例子:
list_slice=['alex','peter','leo','simon']
取單個書
print(list_slice[0])
['alex']
取整個列表
print(list_slice[::])
['alex', 'peter', 'leo', 'simon']
取前三個元素
print(list_slice[0:3]) ?##start_index從0開始惋耙,左包右不包捣炬,就是0,1,2 不包括3
print(list_slice[-4:-1:1])
['alex', 'peter', 'leo']
倒序取數
print(list_slice[0:3:-1]) ##start_index, end_index是0-3熊昌,是說從左向右取,但是step=-1是從右到左取湿酸,相互矛盾
[]
print(list_slice[::-1])##倒序整個list
print(list_slice[3::-1]) ##倒序整個list
['simon', 'leo', 'peter', 'alex']
print(list_slice[3:0:-1]) ##取后三個元素 start_index=3, end_index=0(但是不包括)婿屹,左包右不包
print(list_slice[-1:-4:-1]) ##取后三個元素, start_index, end_index可以用負號來表示元素
['simon', 'leo', 'peter']
連續(xù)切片
print(list_slice[0:4][0:2]) ##理論上可以無數次切片
['alex', 'peter']
嵌套列表的切片
list_list_slice=['alex','peter',['a','b','c'],'leo','simon']
print(list_list_slice[2][0:2])
['a', 'b']
切片的三個參數可以用表達式,如
a[2+1:3*2:7%3]
[3, 4, 5]
等價于 a[2+1:3*2:7%3] = a[3:6:1]
切片range的案例
for i in range(1,100)[2::3][-10:]:?
? ? ? ?print(i)
就是利用range函數生成1-99的整數推溃,然后取3的倍數昂利,再取最后十個。
用切片來修改list
list_slice[0:2] =['x','y']
print(list_slice)
['x', 'y', 'leo', 'simon']
list_slice[0] =['x','y']
print(list_slice)
[['x', 'y'], 'y', 'leo', 'simon']
字符串铁坎,元組的切片操作和列表類似
(一)start_index蜂奸、end_index、step可同為正厢呵、同為負窝撵,也可正負混合使用。但必須遵循一個原則襟铭,否則無法正確切取到數據:當start_index的位置在end_index的左邊時碌奉,表示從左往右取值,此時step必須是正數(同樣表示從左往右)寒砖;當start_index的位置在end_index的右邊時赐劣,表示從右往左取值,此時step必須是負數(同樣表示從右往左)哩都,即兩者的取值順序必須是相同的魁兼。對于特殊情況,當start_index或end_index省略時漠嵌,起始索引和終止索引由step的正負來決定咐汞,不會存在取值方向出現矛盾的情況(即不會返回空列表[]),但正和負取到的結果是完全不同的儒鹿,因為一個向左一個向右化撕。
(二)在利用切片時,step的正負是必須要考慮的约炎,尤其是當step省略時植阴。比如a[-1:],很容易就誤認為是從“終點”開始一直取到“起點”圾浅,即a[-1:]= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]掠手,但實際上a[-1:]=a[-1]=9,原因在于step=1表示從左往右取值狸捕,而起始索引start_index=-1本身就是對象的最右邊的元素了喷鸽,再往右已經沒數據了,因此只有a[-1]一個元素府寒。