1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Python序列類型切片取值徹底剖析

      簡介

      Python中對序列類型某個子集或者區(qū)間的檢索稱作切片。實際上,切片功能非常強大,能夠提供對可編輯序列類型數(shù)據(jù)的增、刪、改、查等各種操作,運用恰當?shù)脑挄O大地節(jié)省編碼量。因此,切片知識在Python開發(fā)中極其重要,如果啃不掉這根硬骨頭,將會給你未來的Python開發(fā)之路帶來極大挫敗感。
      全國二級Python考試中考查的序列類型主要有三種,即字符串、元組和列表,也是實戰(zhàn)中使用最頻繁的數(shù)據(jù)結構。其中,列表是可編輯的,而字符串和元組僅提供讀操作。本文將以列表為例,詳細介紹各種Python考級及實戰(zhàn)中需要的切片取值技巧及有關注意事項。

      創(chuàng)新互聯(lián),專注為中小企業(yè)提供官網(wǎng)建設、營銷型網(wǎng)站制作、響應式網(wǎng)站開發(fā)、展示型成都網(wǎng)站建設、成都網(wǎng)站制作等服務,幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設與網(wǎng)站營銷推廣問題。

      1. 基礎引例

      我們假設讀者是經過初步的切片學習在遇到技巧及概念障礙時才閱讀此文的。為此,可以通過一個基本類型例子,引出切片涉及的基本概念,進而有助于更形象地理解切片。本部分中,如果尚存在疑問,請暫時保留,待認真閱讀完全文后,應該能得到圓滿解答。
      直接創(chuàng)建列表 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:

      a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      a
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      切片的目的是把上述列表中符合某個規(guī)律(如等差數(shù)列、等比數(shù)列或者更復雜的規(guī)律)的元素組成的子集取出來。例如:
      a
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      a[1:5:2]
      [1, 3]
      【簡析】上述切片中,1為切片的起始索引,5為切片的結束索引,2為切片的步長。步長為2決定了切片的方向是從左向右。從索引1(包括)開始向索引5沿著從左向右順序切(根據(jù)步長為2的規(guī)律)出符合條件的下標元素,僅有兩個,即:a[1],a[3]。那么,a[5]是不是包含在結果中呢?不是。因為在確定符合條件的切片子集時,還有一個限定條件是:左閉右開。即對于上面的索引,應當是:[1,5)。請參考下圖:
      Python序列類型切片取值徹底剖析
      上面的引例中出現(xiàn)如下概念及問題:
      【概念】步長(符號與大小)、切片的起始索引位置、切片的終止索引位置、切片的方向。
      【問題】
      ? 如何確定參與切片的子集?
      ? 從哪個索引開始沿著什么方向以多大的跨度(步長)切片?切片的結束索引是什么?
      ? 當切片的起始索引位置與終止索引位置為空時如何處理?

      2. 切片語法格式

      Sequence[start: end: step]

      現(xiàn)總結切片規(guī)則如下:

      1. step:切片的跨度,也就是切片跳躍的長度,也稱“步長”,默認值(省略時)為1。要求:必須是除零外的整數(shù)(可正可負)
      2. step為正時,則從左向右切片,如果start(可為0)和end同符號且start > end,則切片結果集一定為空
      3. step為負時,則從右向左切片,如果start(可為0)和end同符號且start < end,則切片結果集一定為空
      4. start:代表切片的起始索引位置。為空時,表示切片起始索引位置是整個列表的最開始(而且,結果集中包括該元素)。注意:這里的“最開始”并不等于“最左邊”。
        4.1當step為正,start對應列表的最左邊(包含)。
        4.2當step為負,start對應列表的最右邊(=len(列表))。
      5. end:代表切片的截至索引位置。為空時,表示切片終止索引位置是整個列表的最后一個(切片到該元素結束,至于結果集中是否包括該元素,取決于step)。注意:這里的“最后一個”并不等于“最右邊”。
        5.1當step為正,end對應列表的最右邊(=len(列表))。
        5.2當step為負,end對應列表的最左邊(包含)。
      6. start和end同時為空的時候,表示序列中所有元素都要參與切片。當step絕對值為1時,切片結果中包含序列中所有元素;當step絕對值大于1時,切片結果將按step值對應的切片規(guī)律包含序列中相應元素。
      7. 切片的時候,不存在索引越界的問題。例如,給定切片索引小于切片最小索引值,則截止到列表最左邊;如果給定切片索引大于切片最大索引值,則截止到列表最右邊。

      【注意】步長值為0導致錯誤提示“ValueError: slice step cannot be zero”。

      3. 正索引和負索引與等價項

      實質上,序列類型提供了兩種索引類型:正索引和負索引。還是以上面提到的列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]為例,請各位觀察下圖。
      Python序列類型切片取值徹底剖析
      從圖中看出:

      Python序列類型切片取值徹底剖析
      顯然,存在這樣的絕對值關系:
      |0|+|-10|=10,|1|+|-9|=10,……|9|+|-1|=10

      重要技巧

      從上面看到,每一個列表(各種序列類型)中的元素都有兩種下標(注意:a[0]對應a[-10])。在切片分析中,可以把下標轉換成對應的下標來分析。如:
      a[-6::2]等價于a[4::2]
      a[:-6:-1] 等價于a[:4:-1]
      a[-5:-2:2] 等價于a[5:8:2]

      a[:2] 等價于a[0:2] 等價于a[0:2:1]
      a[2:] 等價于a[2:10] 等價于a[2:10:1]
      a[:2:] 等價于a[0:2] 等價于 a[0:2:1]
      ★a[::-1]等價于a[-1:-11:-1]

      4. 典型切片取值舉例

      下面所有例子還是基于前面的列表:

      a
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      為方便總結,我們來分小類型舉例切片的應用。

      4.1. 切片表達式中僅有一對冒號情形

      【提示】這種情況下,暗含著一個前提是:步長值step取值為1,因此切片方向遵循“自左向右”切的原則。
      a
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

      4.1.1 最簡單情形

      a[2:6]
      [2, 3, 4, 5]
      a[2:9]
      [2, 3, 4, 5, 6, 7, 8]
      【提示】在此兩例中,符合“左閉右開”原則,故最后切片結果集中去掉最后一個下標元素。

      4.1.2 切片截止索引位置“超界”

      根據(jù)上面切片規(guī)則7的說明,切片操作時索引不存在真正“越界”問題。請結合切片規(guī)則7看下面的舉例。
      a[2:10]
      [2, 3, 4, 5, 6, 7, 8, 9]
      【解析】根據(jù)“左閉右開”原則,切片結果集將包含a[2],a[3]……直到a[9]的8個元素。
      a[2:20]
      [2, 3, 4, 5, 6, 7, 8, 9]
      【解析】根據(jù)切片規(guī)則7,a[2:20]等價于a[2:10](10=len(a),即列表最右邊)。下面兩個例子理由同這兩個例子:
      a[-3:10]
      [7, 8, 9]
      a[-3:20]
      [7, 8, 9]

      4.1.3 切片的起始索引位置超界

      a[-10:-8]
      [0, 1]
      a[-100:-8]
      [0, 1]
      a[-100:2]
      [0, 1]
      a[-10:2]
      [0, 1]
      【解析】根據(jù)切片規(guī)則7,a[-100:-8]等價于a[-10:-8],a[-10:2] 等價于a[-100:2]。另一方面,a[-10:-8] 等價于a[0:-8](等價于a[0:2]),a[-10:2] 等價于a[0:2],故有上面運行結果。

      4.1.4 切片起始索引或截止索引為負

      a[-2:6]
      []
      【解析】a[-2:6]等價于a[8:6],也等價于a[-2:6:1]和a[8:6:1],此時step=1(省略),易知切片結果集為空。
      a[6:-2]
      [6, 7]
      【解析】a[6:-2]等價于a[6:8],也等價于a[6:-2:1]和a[6:8:1],此時step=1(省略),結合“左閉右開”原則,易知結果集對應[a[6],a[7]](而不包含a[8]),即切片結果集為[6, 7]。

      4.1.5 切片規(guī)則2應用

      a[6:2]
      []
      a[-2:-6]
      []
      【解析】符合切片規(guī)則2,易知切片結果集為空。
      a[-6:-2]
      [4, 5, 6, 7]
      【解析】a[-6:-2] 等價于a[4:8],結合“左閉右開”原則,易知結果集對應[a[4],a[5],a[6],a[7]](而不包含a[8]),即切片結果集為[4,5,6, 7]。

      4.1.6 省略切片起始索引時

      a[:4]
      [0, 1, 2, 3]
      a[:-4]
      [0, 1, 2, 3, 4, 5]
      【解析】根據(jù)上面切片規(guī)則4.1,a[:4]等價于a[0:4],a[:-4] 等價于a[0:-4],而a[0:-4]又等價于a[0:6] ,結合“左閉右開”原則,易知有上面的切片結果集。

      4.1.7 省略切片截止索引時

      a[4:]
      [4, 5, 6, 7, 8, 9]
      a[-4:]
      [6, 7, 8, 9]
      【解析】根據(jù)上面切片規(guī)則5.1,a[4:]等價于a[4:10] (10=len(a)),a[-4:]等價于a[6:],而a[6:]等價于a[6:10] (10=len(a)),結合切片規(guī)則6“左閉右閉”原則(a[9]包含在結果集中),易知有上面的切片結果集。

      4.1.8 切片起始索引和截止索引均省略時

      a[:]
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      【解析】根據(jù)上面切片規(guī)則4.1和5.1,a[:]等價于a[0:10](10=len(a)),而根據(jù)“左閉右開”原則,結果集中應當包含a[0],a[1],……a[9],故有上述切片結果集。

      4.2. 切片表達式中有兩對冒號情形

      在切片表達式有兩對冒號情況下,當step為1時(因為這種情況下可以省略第二對冒號,所以對應上面僅有一對冒號時),絕大部分情形我們已經討論過。
      【前提】本部分中,我們還是使用與上面同樣結構與內容的列表a,如下所示:
      a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

      4.2.1 step>1時

      不失一般性,以下討論不妨假設step=2。先看下面的例子。
      a[2:7:2]
      [2, 4, 6]
      a[:3:2]
      [0, 2]
      a[:-3:2]
      [0, 2, 4, 6]
      a[3::2]
      [3, 5, 7, 9]
      a[-3::2]
      [7, 9]
      【解析】首先注意到,step=2決定了切片方向是自左向右。當step>1時,切片起始索引值默認為0。對于負數(shù)形式的起始還是截止索引值都可以轉換成等價的正數(shù)形式索引值(例如a[:-3:2]等價于a[:7:2]),a[-3::2] 等價于a[7::2])來分析的。再結合“左閉右開”原則,這一組例題應該不難理解,故細節(jié)的解釋在此省略。

      4.2.2 step為負整數(shù)時

      例1

      a[8:3:-1]
      [8, 7, 6, 5, 4]
      【解析】首先注意到,step為-1決定了切片方向是自右向左。本例中,切片起始索引為8,終止索引為3,再結合切片“左閉右開”原則,故切片結果集中元素有[a[8],a[7],a[6],a[5],a[4]],即[8,7,6,5,4]。

      例2

      a[10:0:-2]
      [9, 7, 5, 3, 1]
      【解析】首先注意到,step為-2決定了切片方向是自右向左。其次,根據(jù)上面切片原則7,切片的時候不存在索引越界情況,a[10]不存在,則繼續(xù)往內分析,a[9]=9。于是,結合切片“左閉右開”原則和步長(即跨度)為2,故切片結果集中元素有[a[9],a[7],a[5],a[3],a[1]],即[9,7,5,3,1]。

      例3

      a[0:10:-2]
      []
      【解析】首先注意到,step為-2決定了切片方向是自右向左。而切片初始索引為0,即列表的左邊界,此時再向左切肯定沒有元素可切了。因此,根據(jù)切片規(guī)則3,結果為空列表。

      例4

      a[:4:-1]
      [9, 8, 7, 6, 5]
      【解析】首先注意到,step為-1決定了切片方向是自右向左。此時,切片初始索引對應列表的最右邊(=len(列表)),即有切片從索引10(實際從索引9開始,包含該索引)開始沿著自右向左的方向切片,直到索引4(不包含,依據(jù)是“左閉右開”),故有上述切片結果。

      例5

      a[::-1]
      [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      【解析】首先注意到,step為-1決定了切片方向是自右向左。那么,接下來最關鍵的問題是搞清:在step為負數(shù)且切片初始索引和切片終止索引沒有提供的情況下,這個切片初始索引和切片終止索引的值為多少。結合上面規(guī)則4.2和5.2,初始索引對應列表的最右邊(=len(列表)),切片的截至索引位置為列表的最左邊的左側(即參與切片的子集中包含索引為0的元素)。當然,也可以簡單根據(jù)上面規(guī)則6確定出最終的切片結果為列表中原來所有元素的倒序。

      例6

      a[5::-2]
      [5, 3, 1]
      【解析】首先注意到,step為-2決定了切片方向是自右向左。切片初始索引為5,結果集中自然包含a[5]。根據(jù)上面分析,本例中切片的截至索引位置為列表的最左邊的左側(即參與切片的子集中包含索引為0的元素)。從等價關系來分析的話,a[5::-2]等價于a[5:-11:-2](下標-11對應著下標-10再往左,類似于下標9再往右對應的下標10)。所以,有此例中運行結果。

      思考題

      ? a[0::-1]的結果是多少?
      ? a[:-3:2] 的結果是多少?
      ? a[1:6:-1] 的結果是多少?
      ? a[-6::-1] 的結果是多少?
      ? 連續(xù)切片操作:a[:8][2:5][-1:] 的結果是多少?
      ? a[2+1:3*2:7%3] 的結果是多少?
      ? 下列代碼片斷的運行結果是什么?
      for i in range(1,100)[2::3][-10:]:
      print(i)
      【提示】利用range函數(shù)生成1-99的整數(shù),然后取3的倍數(shù),再取最后十個。

      小結

      理論上而言,只要條件表達式得當,可以通過單次或多次切片操作實現(xiàn)任意切取目標值。初看上去,切片操作的基本語法比較簡單,但是深挖起來,并不簡單。因此,如果不徹底搞清楚內在邏輯,也極容易產生錯誤,而且這種錯誤有時隱蔽得比較深,難以察覺。
      作為補充,本文中提到的“左閉右開”原則,更細致地說法是“開始閉結束開”原則。即是說,開始索引對應元素參與切片運算,而結束索引對應元素并不參與切片運算。另外,步長值為負數(shù),并且在省略切片起始索引或者切片終止索引情況下,這兩種索引的默認值應當結合“切片不存在索引越界”原則進行正確理解。本文通過詳細例子總結歸納了切片操作的各種情況。若有錯誤和不足之處請各位指正!


      本文題目:Python序列類型切片取值徹底剖析
      文章URL:http://ef60e0e.cn/article/ghsoie.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        扎兰屯市| 黔南| 卢氏县| 徐闻县| 交口县| 永宁县| 河西区| 新密市| 海安县| 宣汉县| 冕宁县| 徐汇区| 广南县| 修水县| 鄂托克前旗| 新平| 三明市| 长治市| 米脂县| 开平市| 平舆县| 绥芬河市| 祥云县| 广丰县| 庆阳市| 翼城县| 通海县| 铜陵市| 丰城市| 温宿县| 阿拉善左旗| 紫云| 贵德县| 成都市| 崇仁县| 兖州市| 巨野县| 临沧市| 孝感市| 高平市| 西昌市|