|
|
51CTO旗下网站
|
|
移动端

2.2.4 索引与分片

《自学Python:编程基础、科学计算及数据分析》第2章Python 基础,在本章中,我们将学习Python 语言的基本使用,掌握Python 的基本使用方法,为后续的学习打下基础。本节为大家介绍索引与分片。

作者:李金来源:机械工业出版社|2018-05-03 16:27

2.2.4 索引与分片

1.索引序列(Sequence)是多个元素按照一定规则组成的对象。对于一个有序序列,我们可以通过索引位置的方法来访问对应位置的值。

索引(Indexing)的作用好比一本书的目录,利用目录中的页码,可以快速找到所需的内容。Python使用中括号[]来对有序序列进行索引。字符串可以看成一个由字符元素组成的有序序列:

  1. In [1]: s = "hello world"   
  2. In [2]: s[0]   
  3. Out[2]: 'h' 

Python的索引位置是从 0开始的,所以 0对应与序列的第 1个元素。为了得到序列的第 i个元素,需要使用索引值i-1:

  1. In [3]: s[4]   
  2. Out[3]: 'o' 

Python还引入了负数索引值,负数表示从后向前的索引,如-1索引序列的倒数第 1个元素,-2索引倒数第2个元素:

  1. In [4]: s[-2]   
  2. Out[4]: 'l' 

使用超过序列范围的索引值会抛出异常:

  1. In [5]: s[20]  
  2. IndexError      Traceback (most recent call last)   
  3. <ipython-input-4-79ffc22473a3> in <module>()   
  4. ----> 1 s[20]   
  5.  
  6. IndexError: string index out of range 

2.分片

索引只能从序列中提取单个元素,想要从序列中提取出多个元素,可以使用分片。 在有序序列中,分片(Slicing)可以看成是一种特殊的索引,只不过它得到的内容是一个子序列。其用法为:

  1. var[lower:upper:step] 

分片的范围包括 lower,但不包括 upper。step表示子序列取值间隔大小,如果没有取值,则默认为 1。例如:

  1. In [6]: s[1:3]   
  2. Out[6]: 'el' 

在这个例子中,分片的起始为位置1,包含的元素个数为3-1=2。

分片也支持负数索引值:

  1. In [7]: s[1:-2]   
  2. Out[7]: 'ello wor' 

使用分片时,lower和upper也可以省略。

省略lower,相当于使用默认值0:

  1. In [8]: s[:3]   
  2. Out[8]: 'hel' 

省略upper,相当于使用默认值len(s):

  1. In [9]: s[-3:]   
  2. Out[9]: 'rld' 

如果都省略,得到一个复制的字符串:

  1. In [10]: s[:]   
  2. Out[10]: 'hello world' 

令step为 2,得到一个每两个值取一个的子串:

  1. In [11]: s[::2]   
  2. Out[11]: 'hlowrd' 

当 step取负值时,开头和结尾会反过来,省略 lower对应结尾,省略 upper对应开头。因此,s[::-1]表示字符串 s的一个反序:

  1. In [12]: s[::-1]   
  2. Out[12]: 'dlrow olleh' 

当给定的 upper超出字符串的长度时,Python并不会抛出异常,只会计算到结尾:

  1. In [13]: s[:100]   
  2. Out[13]: 'hello world'  

3.索引和分片规则的探究

在这里简单解释一下Python中索引与分片规则的由来。

(1)使用[low, up)的原因 基于0开头索引规则的假设,讨论使用[low, up)分片规则的原因。如表 2-2所示,考虑不同规则下,字符串“hello”中的子串“el”的表示方式。可以发现,前两种规则在计算序列长度上十分方便,不需要进行额外的加一减一操作。

表 2-2 子串“ el”的不同表示方式

现在只考虑前两种规则。如表 2-3所示,考虑在前两种规则下,字符串“hello”的前3个字符“hel”的表示方式。可以看到,第二种规则的索引位置从-1开始,与我们平时的认知有冲突。所以,Python使用[low, up)的规则对序列进行分片。

表 2-3子串“ hel”的不同表示方式

(2)使用0开头的原因

基于[low, up)分片规则的假设,讨论使用0开头索引规则的原因。

考虑以下两种情况。表示开始的前 n个元素时:

使用0-base:[0, n)

使用1-base:[1, n+1)

表示第i+1到第i+n这n个元素:

使用0-base:[i, n+i)

使用1-base:[i+1, n+i+1)

如果使用 1-base,总会有一个+1成分在后面,这样不是很方便。所以,Python使用 0开头的规则进行索引。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

超级网管员——网络基础

本书全面系统地概括了计算机网络的基本理论,详细阐述了OSI模型与网络协议、网络规划与综合布线、对等网络与服务器/客户端网络、Intranet服...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊