0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

列表切片操作的特點(diǎn)

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-01 16:31 ? 次閱讀

切片熱身

列表的切片操作是指對其中單個或者多個索引對應(yīng)元素進(jìn)行的操作,具有如下幾個特點(diǎn):

  • 切片區(qū)間是左閉右開區(qū)間
  • 切片的下標(biāo)可以是負(fù)數(shù),當(dāng)為負(fù)數(shù)時,意味著從后到前的位置,且-1位倒數(shù)第一個
  • 默認(rèn)步長是1,可通過增加第三個參數(shù)實(shí)現(xiàn)不同切片
  • 步長是-1時,可實(shí)現(xiàn)倒序切片
  • 下標(biāo)缺省時,表示從最"前"到最"后"(這里的前后要結(jié)合上下文來看,具體后面有示例)

例如,下面這些常規(guī)操作大家應(yīng)該都很熟悉:

1lyst = list(range(10))
2lyst[1:4] #[1, 2, 3]
3lyst[1:4:2] #[1, 3]
4lyst[-5:-1] #[5, 6, 7, 8]
5lyst[-1:-5:-1] #[9, 8, 7, 6]

這里重點(diǎn)補(bǔ)充對于缺省下標(biāo)的理解,即列表內(nèi)部是以什么原則處理缺省下標(biāo)值:

1lyst = list(range(10))
2lyst[:2] #[0, 1],起始下標(biāo)缺省,默認(rèn)為0,等價于lyst[0:2]
3lyst[2:] #[2, 3, 4, 5, 6, 7, 8, 9],終止下標(biāo)缺省,默認(rèn)為n=len(lyst),等價于lyst[2:n]
4lyst[:] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],起始和終止下標(biāo)均缺省,等價于lyst[0:n]
5lyst[:2:-1] #[9, 8, 7, 6, 5, 4, 3],步長為負(fù)數(shù)時,起始下標(biāo)缺省,默認(rèn)為-1,等價于lyst[-1:2:-1]
6lyst[2::-1] #[2, 1, 0],步長為負(fù)數(shù)時,終止下標(biāo)缺省,默認(rèn)為-n-1,等價于lyst[2:-n-1:-1]
7lyst[::-1] #[9, 8, 7, 6, 5, 4, 3, 2, 1, 0],步長為負(fù)數(shù),起始和終止下標(biāo)均缺省,默認(rèn)為lyst[-1:-n-1:-1]

總結(jié)來說,就是步長為正數(shù)時,首末缺省下標(biāo)分別是0和n;步長為負(fù)時,首末缺省下標(biāo)分別是-1和-n-1。特別地,當(dāng)步長為-1、首末下標(biāo)均缺省時,效果等價于lyst.reverse()或者reversed(lyst),但具體功能有區(qū)別:

1lyst = list(range(10))
2lyst[::-1] #輸出[9, 8, 7, 6, 5, 4, 3, 2, 1, 0],只是輸出逆序結(jié)果,lyst本身不變
3lyst.reverse() #對列表的inplace操作,無返回值,但執(zhí)行后lyst變?yōu)閇9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
4reversed(lyst) #lyst列表不變,返回逆序結(jié)果,但返回的是一個迭代器對象

另外,列表中切片索引數(shù)值 要求均為整數(shù) (曾有PEP提議,索引可接受任意值,然后由python進(jìn)行隱式取整處理,但被reject了),且 步長索引不能為0

切片訪問

對列表某索引對應(yīng)值進(jìn)行訪問,當(dāng)對單個索引訪問時,要注意索引的合格范圍;但對列表切片時則不會顯式報錯。其中,單索引的合格范圍為-n—n-1,共2n個合格索引,其中n為列表長度;而對于范圍索引時,即使訪問越界也不會顯式報錯,而僅僅是返回結(jié)果為空:

1lyst = list(range(10))
2lyst[10] #IndexError: list index out of range
3lyst[-12] #IndexError: list index out of range
4lyst[5:15] #[5, 6, 7, 8, 9]
5lyst[10:] #[]
6lyst[-12:-1:-1] #[]

這里補(bǔ)充一個親身經(jīng)歷的錯誤:要倒序返回一個列表的前n-1個值(即最后一個元素除外的所有元素倒序輸出),因?yàn)榭梢哉?fù)索引混合使用,所以自己想當(dāng)然的寫下了如下語句:

1lyst[-2:-1:-1] #返回[]

我的邏輯是倒數(shù)第二個索引是-2,返回前面的所有值,第一個值是下標(biāo)0,但由于索引是左開右閉區(qū)間,所以如果寫0的話訪問不到,那么要比0再小一個,也就是-1。但實(shí)際上,python可不這么想,它會將索引-2解釋為倒數(shù)第二個值沒錯,但是索引-1會解釋成倒數(shù)第一個值(更準(zhǔn)確的講,是取不到這個值),所以上面的返回結(jié)果為空,無論步長是正還是負(fù)!

當(dāng)然,實(shí)現(xiàn)這一需求的方法很多,只要理解了切片的索引原則:

1lyst = list(range(10))
2lyst[-2::-1] #[8, 7, 6, 5, 4, 3, 2, 1, 0],缺省下標(biāo)
3lyst[:-1][::-1] #[8, 7, 6, 5, 4, 3, 2, 1, 0],先正序訪問前n-1個值再逆序

切片賦值

前面提到,列表的單索引越界訪問會報錯,切片訪問不報錯但返回結(jié)果為空。這一邏輯也類似于列表的賦值操作: 對于單索引的賦值,要求索引必須在合格范圍之內(nèi),否則報錯;但對于切片的賦值則"無需"考慮索引是否合法,甚至無需考慮賦值長度是否匹配

1a = [1,2,3,4,5]
2b = [5,6]
3a[8] = 8 #IndexError: list assignment index out of range
4a[-8] = 8 #IndexError: list assignment index out of range
5a[8:] = b #執(zhí)行后,a為[1, 2, 3, 4, 5, 5, 6]
6a[-8:-6] = b #執(zhí)行后,a為[5, 6, 1, 2, 3, 4, 5],注意這里限定了賦值區(qū)間首末
7a[-8:-10] = b #執(zhí)行后,a也是[5, 6, 1, 2, 3, 4, 5],即便限定的區(qū)間實(shí)際上為空
8a[-8:] = b #執(zhí)行后,a為[5, 6],因?yàn)閍的賦值區(qū)間未限定長度,而賦值起始索引在a起始之前,所以整體都給覆蓋了

實(shí)際上,由于對超出列表長度的索引位置進(jìn)行切片賦值會直接拼接,所以這個操作相當(dāng)于列表的extend():

1a = [1,2,3,4,5]
2b = [5,6]
3a[len(a):] = b # a為[1, 2, 3, 4, 5, 5, 6]
4a.extend(b) # a也為[1, 2, 3, 4, 5, 5, 6]

既然提到了列表的extend()操作,那么下面的insert()操作不僅不會報錯,而且實(shí)際上相當(dāng)于執(zhí)行了append()操作:

1a = [1,2,3,4,5]
2a.insert(len(a), 100) # a為[1, 2, 3, 4, 5, 100],注意這里insert下標(biāo)參數(shù)為len(a),超出合格范圍,但實(shí)際效果等價于a.append(100)

切片拷貝

由于參數(shù)引用的特殊性,python中的賦值操作或許曾令人抓狂其中而不得自拔,個人也不敢說完全理解其中的原理,所以這一部分權(quán)當(dāng)是拋磚引玉。

正因?yàn)閜ython中拷貝的特殊性,所以有個專門的庫叫copy,里面有2個重要的方法分別是copy.copy()和copy.deepcopy(),顧名思義,后者叫做深拷貝,前者自然就叫做淺拷貝。當(dāng)然,這里不打算介紹這個庫和相應(yīng)方法,而只是想就此引出列表中如何通過切片實(shí)現(xiàn)拷貝。

如果想要對一個列表進(jìn)行拷貝,且后續(xù)操作互不干擾,那么簡單的直接賦值是不能完成任務(wù)的,例如執(zhí)行以下語句,a和b其實(shí)管理和引用的是同一塊內(nèi)存,所以操作是同步的,未實(shí)現(xiàn)真正的拷貝:

1a = [1,2,3,4,5]
2b = a #只是a的一個分身,未拷貝
3a[0] = 100
4b #[100, 2, 3, 4, 5]

如果想要實(shí)現(xiàn)a、b從此毫無瓜葛,那么簡單的拷貝實(shí)現(xiàn)有兩種:

1a = [1,2,3,4,5]
2b = a[:] #真正實(shí)現(xiàn)拷貝
3b = list(a) #也可實(shí)現(xiàn)拷貝
4a[0] = 100
5b #[1, 2, 3, 4, 5]

另外,再體會下這3個例子:

  • 復(fù)制列表,改某個值其他不會受到影響
1a = [0]*10
2a[1] = 1 #[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
  • 嵌套復(fù)制列表,牽一發(fā)動全身
1a = [[0]*10]*2
2a[1][0] = 2 #[[2, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
  • 推導(dǎo)式+復(fù)制生成嵌套列表,改1個值其他不受影響
1a = [[0]*10 for _ in range(2)] 
2a[1][0] = 2 #[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

不得不說,python里面的變量賦值與引用確實(shí)有些難以理解,這個只能靠不斷積累和嘗試,得細(xì)品!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1661

    瀏覽量

    31877
  • 元素
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

    8395
  • 索引
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    10446
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84078
收藏 人收藏

    評論

    相關(guān)推薦

    Python高級特性:迭代器切片的應(yīng)用

    是 Python 中獨(dú)特的一種高級特性,而切片也是一種高級特性,兩者相結(jié)合,會產(chǎn)生什么樣的結(jié)果呢? 1、迭代與迭代器 首先,有幾個基本概念要澄清:迭代、可迭代對象、迭代器。 迭代 是一種遍歷容器類型對象(例如字符串、列表、字典等等)的方式,
    發(fā)表于 11-29 10:11 ?627次閱讀

    Python 切片操作的高級用法

    眾所周知,我們可以通過索引值(或稱下標(biāo))來查找序列類型(如字符串、列表、元組)中的單個元素,那么,如果要獲取一個索引區(qū)間的元素該怎么辦呢? 切片(slice)就是一種截取索引片段的技術(shù),借助切片技術(shù)
    發(fā)表于 11-23 14:19 ?1245次閱讀

    列表框的設(shè)計與操作

    列表框的設(shè)計與操作
    發(fā)表于 02-22 10:14

    請問BGA封裝如何切片?

    請問BGA封裝如何切片?是帶芯片一起切片用顯微鏡觀察錫球情況嗎?是否有自動切片,精度如何?有看到板廠給的異常板切片報告說手工切片具有不確定性
    發(fā)表于 12-04 22:06

    LEICA CM1900冷凍切片機(jī)中文操作手冊

    LEICA CM1900冷凍切片機(jī)中文操作手冊
    發(fā)表于 11-14 01:07 ?51次下載

    Python學(xué)習(xí)要點(diǎn):自定義序列實(shí)現(xiàn)切片功能

    基于原生的序列類型(如字符串、列表、元組),那么,我們是否可以定義自己的序列類型并讓它支持切片語法呢?更進(jìn)一步,我們是否可以自定義其它對象(如字典)并讓它支持切片呢? 1、魔術(shù)方法:__getitem__() 想要使自定義對象支
    發(fā)表于 11-24 11:51 ?643次閱讀

    Labview列表框的功能和操作

    在labview的控件選版中有一種控件叫列表,表格和樹,其中使用最多的屬于列表和表格了,經(jīng)常我們用列表存放顯示測試項(xiàng)目讓客戶可以自己選擇。
    的頭像 發(fā)表于 10-22 11:57 ?1.8w次閱讀
    Labview<b class='flag-5'>列表</b>框的功能和<b class='flag-5'>操作</b>

    網(wǎng)絡(luò)切片的分類 網(wǎng)絡(luò)切片粒度如何選擇

    網(wǎng)絡(luò)切片是一種按需組網(wǎng)的方式,可以讓運(yùn)營商在統(tǒng)一的基礎(chǔ)設(shè)施上分離出多個虛擬的端到端網(wǎng)絡(luò),每個網(wǎng)絡(luò)切片從無線接入網(wǎng)承載網(wǎng)再到核心網(wǎng)上進(jìn)行邏輯隔離,以適配各種各樣類型的應(yīng)用。 網(wǎng)絡(luò)切片的分類 1、獨(dú)立
    的頭像 發(fā)表于 09-03 17:01 ?3476次閱讀

    5G 網(wǎng)絡(luò)切片之OTN切片和FlexE切片區(qū)別

    5G 網(wǎng)絡(luò)切片本質(zhì)上是一個 E2E 概念,將用戶設(shè)備連接到租戶特定的應(yīng)用程序。E2E 網(wǎng)絡(luò)切片由RAN 切片、核心切片和傳輸切片組成。每個網(wǎng)
    發(fā)表于 01-04 11:56 ?3307次閱讀

    python列表序列操作教程

    python列表也是序列對象,可以進(jìn)行序列通用的操作,類似字符串序列的操作
    的頭像 發(fā)表于 02-23 15:04 ?553次閱讀

    Python序列的列表類型介紹

    列表:用于存儲任意數(shù)目、任意類型的數(shù)據(jù)集合。 列表是內(nèi)置可變序列,是包含多個元素的有序連續(xù)的內(nèi)存空間。 特點(diǎn): 有序, 可變, 中括號[] 列表的標(biāo)準(zhǔn)語法格式:a = [10,20,3
    的頭像 發(fā)表于 03-08 17:27 ?1179次閱讀

    Python列表的基本概念、常用操作及實(shí)際應(yīng)用

    Python列表是一種強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),用于在程序中存儲和操作一系列的值。列表是可變的(mutable),可以動態(tài)地增加、刪除和修改其中的元素。在Python中,列表是最常用的數(shù)據(jù)結(jié)構(gòu)之
    的頭像 發(fā)表于 04-16 10:42 ?1482次閱讀

    golang通過切片創(chuàng)建新的切片

    通過切片創(chuàng)建新的切片 切片之所以被稱為切片,是因?yàn)閯?chuàng)建一個新的切片,也就是把底層數(shù)組切出一部分。通過切片
    的頭像 發(fā)表于 10-09 09:48 ?614次閱讀
    golang通過<b class='flag-5'>切片</b>創(chuàng)建新的<b class='flag-5'>切片</b>

    數(shù)組中如何增加切片的容量

    切片擴(kuò)容 相對于數(shù)組而言,使用切片的一個好處是:可以按需增加切片的容量。 Golang 內(nèi)置的 append() 函數(shù)會處理增加長度時的所有操作細(xì)節(jié)。要使用 append() 函數(shù),需
    的頭像 發(fā)表于 10-09 10:01 ?517次閱讀
    數(shù)組中如何增加<b class='flag-5'>切片</b>的容量

    如何對切片軟件進(jìn)行操作

    在3D打印模型設(shè)計好之后,就是對于切片軟件的使用了,它可以將虛擬設(shè)計的3D模型打印出來,成為一個真正的實(shí)體。 那如何對切片軟件進(jìn)行操作呢? 本次主要是對于切片軟件“Repetier-H
    的頭像 發(fā)表于 11-06 17:04 ?567次閱讀
    如何對<b class='flag-5'>切片</b>軟件進(jìn)行<b class='flag-5'>操作</b>