作者 | Giorgos Myrianthous

编译 | VK
来源 | Towards Data Science

在Python中,像字符串或列表这样的有序序列的元素可以通过它们的索引单独访问。这可以通过提供我们希望从序列中提取的元素的数字索引来实现。另外,Python支持切片,这是一个特性,可以让我们提取原始sequence对象的子集。

在本文中,我们将探讨索引和切片是如何工作的,以及如何使用它们来编写更干净、更具python风格的代码。

索引

与大多数编程语言一样,Python偏移量从位置0开始,在位置N-1结束,其中N被定义为序列的总长度。例如,字符串Hello的总长度等于5,每个字符都可以通过索引0到4进行访问,如下图所示:

现在,你可以通过编程方式访问字符串中的各个字符,方法是提供要获取的相应偏移量(用方括号括起来):

>>> my_string = 'Hello'
>>> print(my_string[0])
'H'
>>> print(my_string[2])
'l'
>>> print(my_string[3])
'l'

同样重要的是要知道,当你尝试访问大于序列长度(减1)的偏移量时,Python将抛出一个IndexError,通知你请求的偏移量超出范围:

>>> my_string[5]
Traceback (most recent call last):File "<input>", line 1, in <module>
IndexError: string index out of range

还可以通过提供一个负索引来访问元素,该索引基本上对应于从序列右侧开始的索引。最后一项可以通过-1访问,倒数第二项可以通过-2访问,依此类推

从技术上讲,当使用负偏移量时,Python会将该偏移量添加到序列的长度中,以便推断准确的位置。例如,假设我们要使用负偏移量从字符串my_string = 'Hello’中提取字符e。现在表达式my_string[-4]基本上将被翻译成my_string[len(my_string) - 4],它相当于my_string[5 - 4]和my_string[1],最终为我们提供所需的输出:

>>> my_string[-4]
'e'

切片

切片是一种索引形式,它允许我们推断原始序列的整个(子)部分,而不仅仅是单个项。

要在Python中对序列执行切片,需要提供两个由冒号分隔的偏移量,尽管在某些情况下可以只定义其中一个,甚至不定义(下面将讨论更多关于这些情况的内容)。

第一个偏移量表示起点并包含在内,而第二个偏移量表示终点,但与起点偏移量不同,它不包含在内。

my_string[start:end]

因此,在执行切片时,Python将返回一个新对象,其中包含从下索引开始到上索引少一个位置的所有元素。作为一个例子,考虑一个用例,其中我们需要获取字符串的前两个元素:

>>> my_string[0:2]
'He'

正如我已经提到的,2个位置都提供并不是强制性的。如果忽略起始偏移量,则其值将默认为0。另一方面,如果不提供结束偏移量,则其默认值将等于序列的长度。实际上有三种不同的情况,如下所示:

my_string[0:]   # 忽略终点
my_string[:-1]  # 忽略起点
my_string[:]    # 都忽略

忽略终点偏移

当我们想切掉前导文本时,第一个符号通常很有用。假设我们想要得到字符串的第一个字符以外的所有字符。我们可以使用以下符号

>>> my_string = 'Hello'
>>> my_string[1:]
'ello'

正如我们已经提到的,当结束偏移量被忽略时,默认是序列的长度:

>>> my_string[1:] == my_string[1:len(my_string)]
True

忽略起始偏移

假设我们现在只需要字符串的第一个字符。在这种情况下,忽略起始偏移量将起到以下作用:

>>> my_string = 'Hello'
>>> my_string[:-1]
'Hell'

如果跳过下限,则其值将默认为0:

>>> my_string[:-1] == my_string[0:-1]
True

忽略两个偏移

Python中的切片表示法允许我们省略起始偏移和结束偏移。

>>> my_string = 'Hello'
>>> my_string[:] == my_string[0:len(my_string)]
True

如果忽略下限和上限,则默认值分别为0和len(序列),你可能想知道这是否有帮助或用处。好吧,这是一种快速复制对象的方法,如下所示

>>> my_string = 'Hello'
>>> my_string_copy = my_string[:]

请注意,当此切片技术将生成一个不同的对象时,该对象将被分配到不同的内存位置。这对字符串之类的不可变对象类型没有任何区别,但是在处理列表之类的可变对象类型时,注意这一点非常重要。

扩展切片

Python中的切片表达式附带了第三个索引,该索引是可选的,指定时用作步骤。显然,当省略step值时,它默认为1,这意味着请求的sequence子部分中的任何元素都不会被跳过。符号如下所示

[start:end:step]

例如,假设我们有一个字符串,其中包含字母表中的字母,我们希望从位于位置1和19的字母中提取其中的所有其他项,:

>>> import string
>>> my_string = string.ascii_lowercase # 'abcdefg...'
>>> my_string[1:20:1]
'bdfhjlnprt'

这种符号可以用来代替列表生成式。例如,假设我们想要得到一个列表中所有具有偶数索引的元素。实现这一点的列表生成式是

>>> my_list = [100, 400, 34, 179, 0, 89, 121]
>>> [value for index, value in enumerate(my_list) if index % 2 == 0]
[100, 34, 0, 121]

在这种情况下,切片表示法可以使我们的代码更简单,可读性更高:

>>> my_list = [100, 400, 34, 179, 0, 89, 121]
>>> my_list[::2]
[100, 34, 0, 121]

与开始偏移和结束偏移一样,步长索引可以是负数。从技术上讲,当我们想要反转有序序列中元素的顺序时,这是很有用的

>>> my_string = 'Hello'
>>> my_string[::-1]
'olleH'

换句话说,当应用负步幅索引时,起始偏移和结束偏移的效果是相反的。为了弄清楚这一点,让我们跳到另一个例子中,我们实际上定义了所有三个可能的偏移量。

>>> import string
>>> my_string = string.ascii_lowercase # 'abcdefg...'
>>> my_string[20:10:-1]
'utsrqponml'

在上面的例子中,我们基本上按照相反的顺序从索引11到20创建一个新字符串。

结论

在本文中,我们探讨了在Python中索引和切片是如何工作的。这两种符号在大多数Python应用程序中都被广泛使用,因此你需要确保了解它们是如何工作的。

索引

  • 第一项从偏移量0开始

  • 最后一项结束于偏移长度len(my_sequence) - 1

  • 负指数表示计数将向后开始。从本质上讲,它被添加到序列的长度中。例如,my_string[-1]转换为my_string[len(my_string) - 1]

切片

  • 起始索引(下限)包含在内

  • 结束索引(上限)不包含在内

  • 当忽略起始索引时,它默认为0

  • 如果省略结束索引,则默认为序列的长度

  • 如果省略起始索引和结束索引,则会创建原始对象的副本-my_string[:]

  • 第三个索引表示步幅

  • 省略步幅索引时,默认为1(即不跳过任何元素)

  • 负步幅索引可以帮助我们创建反向序列(例如,my_string[::-1])

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

【Python】掌握Python中的索引和切片相关推荐

  1. Python列表操作小技巧——索引、切片、增添、删除、修改和其他用法

    关于列表,需要对其说明如下三点: 列表的构造是通过英文状态下的方括号完成的,即[].可以将每一个元素存放在中括号中,而且列表中的元素是不受任何限制的,可以存放数值.字符串及其他数据结构的内容. 列表是 ...

  2. python 获取列表中多个元素-切片操作

    # -*-coding:utf-8 -*- # @Time : 20:48 # @Author: 黄荣津 # @File : 4.获取列表中多个元素-切片操作.py # @Software: PyCh ...

  3. Python | 在列表中指定索引处添加元素的程序

    Given a list and we have to add an element at specified index in Python. 给定一个列表,我们必须在Python中的指定索引处添加 ...

  4. 【Python】Python入门:4000字能把元组tuple讲透吗?

    公众号:尤而小屋 作者:Peter 编辑:Peter 在前面介绍的python数据类型:列表list,我们发现list是可以进行修改的.但是有时候,我们需要创建一系列不可修改的元素,此时Python中 ...

  5. Pandas知识点-索引和切片操作

    Pandas知识点-索引和切片操作 索引和切片操作是最基本最常用的数据处理操作,Pandas中的索引和切片操作基于Python的语言特性,支持类似于numpy中的操作,也可以使用行标签.列标签以及行标 ...

  6. python中iloc切片_如何使用iloc和loc 对Pandas Dataframe进行索引和切片

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在这篇文章中,我们将使用iloc和loc来处理数据.更具体地说,我们将通过iloc和loc例子来学习切片和 ...

  7. python中索引和下标_Series下标索引、标签索引、切片索引、布尔索引

    Series的values属性可以获取值,Series的索引也可以获取值且更加灵活.Series是dict-like类型,也是list-like类型,可以模仿字典和列表获取数据,比如可以用get方法获 ...

  8. python 字符串,字符串运算,比较,索引,切片等

    一: 字符串: str 作用:用来记录文本信息, 字面值表示方法:用引号括起来的部分都是字符串. '' 单引号 "" 双引号 ''' 三引号 """ ...

  9. python列表根据值找索引_python实现列表中由数值查到索引的方法

    python实现列表中由数值查到索引的方法 如下所示: 以上这篇python实现列表中由数值查到索引的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 时间: 201 ...

最新文章

  1. Matlab2012a下配置LibSVM—3.18
  2. C#_汉字与GBK,Unicode,UTF-8编码之间的转换
  3. Python Django模板templates渲染及配置
  4. ascii码01100001_ASCII编码和Unicode编码
  5. 【讨论】从吉日的一段话说起+寻找WinForm架构的最佳实践
  6. Scikit_Learn介绍及演练
  7. java皮肤库的框架_VC 添加皮肤库
  8. 微软再损一将!继Nat Friedman后,另一Xamarin联合创始人也已离职
  9. 实时数据库之数据采集
  10. matlab怎么排序数组,如何在MATLAB中排序结构数组?
  11. vim编辑器下载Linux版,强大的vim编辑器【下载!linux基础命令豪华版】
  12. java计算机毕业设计房产中介管理系统源码+系统+lw+数据库+调试运行
  13. win10中安装centos7双系统
  14. 干货,值得收藏!Python 操作 Excel 报表自动化指南!
  15. 什么人能成为Leader,大Leader该做什么
  16. echarts 设置仪表盘数字的位置_【Python代替Excel】11:用Python做数据仪表盘
  17. 三个变量存在一个协整方程_计量经济学31个简答参考答案
  18. 走钢索的人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十七)[转]...
  19. 2011年年终珠三角为主的各种工种收入大全
  20. 序列3:序列方法实操上

热门文章

  1. 使用百度地图API制作线路轨迹播放
  2. Socket网络编程--小小网盘程序(4)
  3. 主机和虚拟机ping不通的原因
  4. Excel制作图表的方法
  5. 如何消除网站安全的七大风险
  6. MFC 单文档如何修改背景。
  7. oracle怎么捕获表上的DML语句(不包括select)语句)
  8. 解析Vue.js中的computed工作原理
  9. [2018/11/14] 学习的思考
  10. Obj文件和Bin文件