在上一篇《手把手陪您学Python》7——字符串的索引中,我们初步了解了字符串的位置索引方法。之所以把索引和切片分开两篇写,上一篇也说了,是为了把切片的方式和规则能够讲的更清楚,有助于我们应对未来在不同的数据结构上,应对更复杂的切片方式。

简单来说,一个索引对应的是一个内容(字母、数字、符号等),而切片对应的则是一段内容。

与索引的单一位置表示不同,切片有一个基本的语法表达式:

object[start_index:end_index:step]

这个object,可以是我们正在讲的字符串,也可以是我们以后要讲到的列表、数组、DataFrame等等。从这就可以看出来,他们的切片方式是一样的,所以一定要把基本功学扎实。

star_index和end_index代表着切片的起点和重点,与我们上一篇说到的从左往右数和从右往左数,并不完全相同,具有高的灵活性。需要特别强调的是,end_index是不包括在内的,类似数学中左闭右开的概念。

例如,str[0:5],代表的是字符串从左往右数第0、1、2、3、4,一共5个位置对应的内容,但是不包括end_index为5这个位置对应的内容。

在此处还有一个规则,就是遇到包含头或者包含尾的切片时,头尾的索引位置可以忽略不写,那么str[0:5]就可以写为str[:5],str[-10:-1]就可以写为str[:-1]。

但是str[-5:-1]和str[-5:]是不一样的,前者是不包括-1这个位置的,但是后者是包括的,也就是一直到字符串的最后一个字符(后面有示例)。

聪明如你,如果要把整个字符串都选上,就可以写成str[:]了。

step是切片时每个取样的间隔步长,也就是每多少个值取一个值,默认是1。当我们不输入这个参数的时候,都是按照从左往右每一个值取一个值,也就是连续取值的意思。

step参数对于切片来说非常重要,因为它不仅决定了取值的步长,还决定了取值的方向。

当step为正数时,切片是从左往右取值的,同时也就要求star_index和end_index的位置也是从左到右的,也就是起点位置要在终点位置的左边。

当step为负数时,切片是从右往左取值的,同时也就要求star_index和end_index的位置也是从右到左的,也就是起点位置要在终点位置的右边。

无论位置索引是正数还是负数,甚至是正负数混合的,只要让起点位置、终点位置、步长的正负值,满足上面的要求就可以。

如果不满足,虽然不会报错,但是会返回空字符串。

为了更直观地说明上述规则,画了下面这张示例图,并用一个字符串进行举例,对上面比较晦涩的定义进行解释。

python dataframe根据位置切片重命名 dataframe字符串切片_字符串

考虑这个最简单的字符串,str = '0123456789'。它的值和从左往右的位置索引是一样的,可以让我们更清楚地看到切片结果。

当step=1时:(默认值,可以写出来也可以不写出来,这里按照惯例不写出来)

In [1]: str = '0123456789'
 
In [2]: str[0:5]   # 起点、终点均为正值
Out[2]: '01234'

In [3]: str[-5:-1]   # 起点、终点均为负值
Out[3]: '5678'

In [4]: str[-5:]   # 起点为负值,终点省略,可以取到字符串最后一个值
Out[4]: '56789'

In [5]: str[2:-6]   # 起点为正值,终点为负值
Out[5]: '23'

In [6]: str[-8:6]   # 起点为负值,终点为正值
Out[6]: '2345'

In [7]: str[8:3]   # 起点在终点右侧
Out[7]: ''

In [8]: str[-2:-8]   # 起点在终点右侧
Out[8]: ''

In [9]: str[8:-10]   # 起点在终点右侧
Out[9]: ''

In [10]: str[-1:8]   # 起点在终点右侧
Out[10]: ''

In [11]: str[-1:9]   # 起点和终点一个位置,但终点不包括在内
Out[11]: ''

当step=-1时:

In [12]: str[8:3:-1]   # 起点、终点均为正值
Out[12]:'87654'

In [13]: str[-2:-8:-1]   # 起点、终点均为负值
Out[13]:'876543'

In [14]: str[8:-10:-1]   # 起点为正值,终点为负值
Out[14]: '87654321'

In [15]: str[8::-1]   # 起点为正值,终点省略,可以取到字符串第一个值
Out[15]: '876543210'

In [16]: str[-1:8:-1]   # 起点为负值,终点为正值
Out[16]: '9'

In [17]: str[0:5:-1]   # 起点在终点左侧
Out[17]: ''

In [18]: str[-5:-1:-1]   # 起点在终点左侧
Out[18]: ''

In [19]: str[2:-6:-1]   # 起点在终点左侧
Out[19]: ''

In [20]: str[-8:6:-1]   # 起点在终点左侧
Out[20]: ''

In [21]: str[-1:9:-1]   # 起点和终点一个位置,但终点不包括在内
Out[21]: ''

上面用20条语句遍历了起点、终点和步长的不同正负号的组合情况,以及最终的结果。

每条语句后的“#”是注释符,是为了说明语句的含义,不会对运行造成影响。

可能最开始看到会觉得有点晕,请大家耐心地逐一验证,如果还有其他在上例中没有涉及到的情景,也请大家自己进行测试。

如果大家能够靠自己计算,能得到同样正确的结果,那么恭喜大家,说明大家这部分的知识就已经很扎实了,足以能够很好地应对后面将会学到或者遇到的任何情景了。

上面的示例讲的都是连续切片的情况,也就是step=1或者-1。如果改变step的值,就可以实现不连续切片了。

In [22]: str[0:5:2]
Out[22]: '024'

In [23]: str[-5:0:-3]
Out[23]: '52'

到这里,字符串的切片也讲完了,可能这是我们学习Python以来,遇到的第一个比较绕的主题,但概念应该并不复杂,只要大家能够耐心自己算几次就会很熟悉了。

 

python dataframe根据位置切片重命名 dataframe字符串切片_切片_02

 


感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^