在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

列表切片操作的特點

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

切片熱身

列表的切片操作是指對其中單個或者多個索引對應元素進行的操作,具有如下幾個特點:

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

例如,下面這些常規操作大家應該都很熟悉:

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]

這里重點補充對于缺省下標的理解,即列表內部是以什么原則處理缺省下標值:

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

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

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

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

切片訪問

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

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] #[]

這里補充一個親身經歷的錯誤:要倒序返回一個列表的前n-1個值(即最后一個元素除外的所有元素倒序輸出),因為可以正負索引混合使用,所以自己想當然的寫下了如下語句:

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

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

當然,實現這一需求的方法很多,只要理解了切片的索引原則:

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

切片賦值

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

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 #執行后,a為[1, 2, 3, 4, 5, 5, 6]
6a[-8:-6] = b #執行后,a為[5, 6, 1, 2, 3, 4, 5],注意這里限定了賦值區間首末
7a[-8:-10] = b #執行后,a也是[5, 6, 1, 2, 3, 4, 5],即便限定的區間實際上為空
8a[-8:] = b #執行后,a為[5, 6],因為a的賦值區間未限定長度,而賦值起始索引在a起始之前,所以整體都給覆蓋了

實際上,由于對超出列表長度的索引位置進行切片賦值會直接拼接,所以這個操作相當于列表的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()操作不僅不會報錯,而且實際上相當于執行了append()操作:

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

切片拷貝

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

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

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

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

如果想要實現a、b從此毫無瓜葛,那么簡單的拷貝實現有兩種:

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

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

  • 復制列表,改某個值其他不會受到影響
1a = [0]*10
2a[1] = 1 #[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
  • 嵌套復制列表,牽一發動全身
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]]
  • 推導式+復制生成嵌套列表,改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里面的變量賦值與引用確實有些難以理解,這個只能靠不斷積累和嘗試,得細品!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 參數
    +關注

    關注

    11

    文章

    1865

    瀏覽量

    32770
  • 元素
    +關注

    關注

    0

    文章

    47

    瀏覽量

    8561
  • 索引
    +關注

    關注

    0

    文章

    59

    瀏覽量

    10601
  • python
    +關注

    關注

    56

    文章

    4822

    瀏覽量

    85857
收藏 人收藏

    評論

    相關推薦

    Python高級特性:迭代器切片的應用

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

    Python 切片操作的高級用法

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

    列表框的設計與操作

    列表框的設計與操作
    發表于 02-22 10:14

    請問BGA封裝如何切片

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

    LEICA CM1900冷凍切片機中文操作手冊

    LEICA CM1900冷凍切片機中文操作手冊
    發表于 11-14 01:07 ?52次下載

    Python學習要點:自定義序列實現切片功能

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

    Labview列表框的功能和操作

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

    網絡切片的分類 網絡切片粒度如何選擇

    網絡切片是一種按需組網的方式,可以讓運營商在統一的基礎設施上分離出多個虛擬的端到端網絡,每個網絡切片從無線接入網承載網再到核心網上進行邏輯隔離,以適配各種各樣類型的應用。 網絡切片的分類 1、獨立
    的頭像 發表于 09-03 17:01 ?3862次閱讀

    5G 網絡切片之OTN切片和FlexE切片區別

    5G 網絡切片本質上是一個 E2E 概念,將用戶設備連接到租戶特定的應用程序。E2E 網絡切片由RAN 切片、核心切片和傳輸切片組成。每個網
    發表于 01-04 11:56 ?4635次閱讀

    python列表序列操作教程

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

    Python序列的列表類型介紹

    列表:用于存儲任意數目、任意類型的數據集合。 列表是內置可變序列,是包含多個元素的有序連續的內存空間。 特點: 有序, 可變, 中括號[] 列表的標準語法格式:a = [10,20,3
    的頭像 發表于 03-08 17:27 ?1545次閱讀

    Python列表的基本概念、常用操作及實際應用

    Python列表是一種強大的數據結構,用于在程序中存儲和操作一系列的值。列表是可變的(mutable),可以動態地增加、刪除和修改其中的元素。在Python中,列表是最常用的數據結構之
    的頭像 發表于 04-16 10:42 ?2174次閱讀

    golang通過切片創建新的切片

    通過切片創建新的切片 切片之所以被稱為切片,是因為創建一個新的切片,也就是把底層數組切出一部分。通過切片
    的頭像 發表于 10-09 09:48 ?854次閱讀
    golang通過<b class='flag-5'>切片</b>創建新的<b class='flag-5'>切片</b>

    數組中如何增加切片的容量

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

    如何對切片軟件進行操作

    在3D打印模型設計好之后,就是對于切片軟件的使用了,它可以將虛擬設計的3D模型打印出來,成為一個真正的實體。 那如何對切片軟件進行操作呢? 本次主要是對于切片軟件“Repetier-H
    的頭像 發表于 11-06 17:04 ?1239次閱讀
    如何對<b class='flag-5'>切片</b>軟件進行<b class='flag-5'>操作</b>
    主站蜘蛛池模板: 五月天丁香花婷婷 | 激情综合网婷婷 | 欧美人与动性视频在线观 | 福利午夜在线 | 六月婷婷视频 | 理论在线视频 | 澳门三级bd高清 | 五月天婷婷亚洲 | 999久久精品国产 | 免费性bbbb台湾 | www.色网 | 天天操伊人| 中文字幕亚洲综合久久2 | 四虎国产精品免费久久影院 | 美日韩一级 | 手机看片久久青草福利盒子 | 黄到让你下面湿的视频 | 男人操女人视频在线观看 | 综合色吧| 狠狠做深爱婷婷久久一区 | ww欧洲ww欧洲视频 | 加勒比综合| 亚洲mm8成为人影院 亚洲qingse中文在线 | 一级毛片在线不卡直接观看 | eeuss影院www影院夜场 | 四虎国产精品永久免费网址 | 日日干夜夜骑 | 免费黄色三级网站 | 国产成人v爽在线免播放观看 | 性欧美暴力猛交69hd | 亚洲免费网 | 狠狠88综合久久久久综合网 | 日本xxx69| 日韩福利一区 | 亚洲手机看片 | 四虎最新紧急入口4hu | 欧美a一级 | 97爱sese| 久久亚洲欧美成人精品 | 欧美香蕉在线 | xxxx日本xx|