刚上手 Python 那会儿,每次想从一串数据里,比如一个列表或者一段文字里,抓取点什么东西出来,老是犯迷糊。那个叫做索引(或者有人叫它下标,没差啦,指的都是位置)的东西,看着简单,实际操作起来,特别是那个从零开始的计数,哦,简直能把人绕晕。但信我,这玩意儿,一旦你感觉对了,Python 的大门等于向你敞开了一半。所以,今天咱们就掰扯掰扯这 python怎么索引 的事儿,从最基础的指哪打哪,到批量抓取的切片,争取一次说明白,让你再也不懵圈。

你想啊,你的数据,不管是 ['苹果', '香蕉', '樱桃'] 这样的列表,还是 "你好世界" 这样的字符串,它们都是序列,意味着里头的东西是有顺序的,一个挨着一个排得整整齐齐。索引 就是那个能让你直接跳到某个位置的“门牌号”。

记住最重要的事儿:在 Python 里,第一个元素的索引!不是一,是零。这跟咱们数数习惯不一样,但所有编程语言几乎都这样搞,没办法,硬着头皮也得接受。

举个例子,咱们拿个列表开刀:

python
水果 = ['苹果', '香蕉', '樱桃', '芒果']

你想拿到第一个水果?那不是 水果[1] 哦!是 水果[0]

“`python
第一个 = 水果[0] # 结果就是 ‘苹果’
print(第一个) # 打印出来看看,嗯,是它!

第二个 = 水果[1] # 这才是 ‘香蕉’
print(第二个)

第三个 = 水果[2] # 樱桃
print(第三个)
“`

看到了吧,[0] 指向第一个,[1] 指向第二个,以此类推。这就是正向索引,从左往右,从 0 开始数。

字符串 也完全一样,本质上就是字符组成的序列。

python
问候语 = "你好,Python!"

想拿到第一个字?

“`python
第一个字 = 问候语[0] # 是 ‘你’
print(第一个字)

第五个字 = 问候语[4] # 注意啊,空格也算一个字符!这是 ‘,’
print(第五个字)
“`

所以啊,无论是列表字符串,还是元组(另一种不可变的序列类型,索引方式跟列表一模一样),正向索引 都是这么个玩法:[0], [1], [2], ...。简单粗暴,但要牢记那个零!

但 Python 聪明在哪呢?它还提供了一种特别方便的方式:负向索引

想象一下,你想拿最后一个元素。如果用正向索引,你得先知道序列有多长,然后用长度减一作为索引。太麻烦了!Python 直接让你从末尾开始数,用负数。

最后一个元素的索引-1

倒数第二个是 -2

倒数第三个是 -3

以此类推。

“`python
水果 = [‘苹果’, ‘香蕉’, ‘樱桃’, ‘芒果’]

最后一个水果 = 水果[-1] # 结果是 ‘芒果’
print(最后一个水果)

倒数第二个 = 水果[-2] # ‘樱桃’
print(倒数第二个)

问候语 = “你好,Python!”
最后一个字 = 问候语[-1] # ‘!’
print(最后一个字)
“`

怎么样?负向索引 是不是超赞?尤其处理最后一个或者倒数几个元素时,简直不要太方便。这玩意儿,第一次见到的时候,我心里就嘀咕:“哇塞,Python 考虑得真周到啊!”

Okay,单个元素咱们会抓了。但实际干活儿的时候,你肯定不只想要一个。你可能想要列表的前三个,或者字符串的中间一段。这时候,单纯的索引就不够用了,得请出大杀器:切片 (Slicing)。

切片 就像是拿刀从序列里切下一段。它的语法有点像索引的升级版,用冒号 : 分隔:

[开始位置 : 结束位置 : 步长]

咱们一个个说:

  • 开始位置 (Start): 切片从哪里开始。这个位置的元素是包含在结果里的。如果不写,默认就是从头开始(索引 0)。
  • 结束位置 (Stop): 切片在哪里结束。注意,这个位置的元素是不包含在结果里的!不包含!这是切片里最容易犯错的地方,务必记住:左闭右开,[开始, 结束)。如果不写,默认就是到序列的末尾。
  • 步长 (Step): 每隔多少个元素取一个。默认是 1,也就是挨个取。如果你设成 2,就隔一个取一个。如果设成负数,比如 -1,那意思就是从右往左取,用来反转序列简直神速!

来点儿活生生的例子,还是拿水果和问候语下手:

“`python
水果 = [‘苹果’, ‘香蕉’, ‘樱桃’, ‘芒果’, ‘葡萄’, ‘橙子’]

取前三个水果

前三个 = 水果[0 : 3] # 从索引 0 开始,到索引 3 结束(不包含 3)
print(前三个) # 结果:[‘苹果’, ‘香蕉’, ‘樱桃’]

取中间的水果(香蕉、樱桃、芒果)

中间的 = 水果[1 : 4] # 从索引 1 开始,到索引 4 结束(不包含 4)
print(中间的) # 结果:[‘香蕉’, ‘樱桃’, ‘芒果’]

问候语 = “你好,Python!很高兴认识你。”

取 “Python” 这部分

P 在索引 3,!在索引 10。Python 是 6个字符。

P(3), y(4), t(5), h(6), o(7), n(8)

所以我们要从 3 取到 9 (不包含 9)

python部分 = 问候语[3 : 9]
print(python部分) # 结果:’Python’
“`

看到 结束位置 的“不包含”魔咒了吗?水果[0:3] 拿到的是 0, 1, 2 这三个位置的元素。问候语[3:9] 拿到的是 3, 4, 5, 6, 7, 8 这六个位置的字符。

切片 里省略 开始位置结束位置 也超常用:

“`python

从头开始取到索引 4 (不包含 4)

前面几个 = 水果[:4] # 等价于 水果[0:4]
print(前面几个) # 结果:[‘苹果’, ‘香蕉’, ‘樱桃’, ‘芒果’]

从索引 2 开始取到最后

后面几个 = 水果[2:] # 等价于 水果[2:len(水果)]
print(后面几个) # 结果:[‘樱桃’, ‘芒果’, ‘葡萄’, ‘橙子’]

复制整个列表 (从头到尾,步长为 1)

水果副本 = 水果[:]
print(水果副本) # 结果:[‘苹果’, ‘香蕉’, ‘樱桃’, ‘芒果’, ‘葡萄’, ‘橙子’]
“`

最炫酷的可能要数 步长 的用法了:

“`python

每隔一个取一个

隔着取 = 水果[::2] # 从头到尾,步长为 2
print(隔着取) # 结果:[‘苹果’, ‘樱桃’, ‘葡萄’]

步长为负数,反转序列!

反转水果 = 水果[::-1] # 从头到尾,步长为 -1 (从右往左取)
print(反转水果) # 结果:[‘橙子’, ‘葡萄’, ‘芒果’, ‘樱桃’, ‘香蕉’, ‘苹果’]

反转问候语 = 问候语[::-1]
print(反转问候语) # 结果:’。你识认兴高!nohtyP,好你’
“`

[::-1] 来反转列表或字符串,简直是 Python 的标志性操作之一,又简洁又酷。

当然,切片 也能和负向索引 结合使用:

“`python
水果 = [‘苹果’, ‘香蕉’, ‘樱桃’, ‘芒果’, ‘葡萄’, ‘橙子’]

取最后两个水果

最后两个 = 水果[-2:] # 从倒数第二个开始,取到最后
print(最后两个) # 结果:[‘葡萄’, ‘橙子’]

取除了最后一个字符之外的所有字符

问候语 = “你好,Python!很高兴认识你。”
除了最后一个 = 问候语[:-1] # 从头开始,取到倒数第一个结束(不包含倒数第一个)
print(除了最后一个) # 结果:’你好,Python!很高兴认识你’
“`

你看,索引切片 配合起来,几乎能让你从任何序列数据里随心所欲地提取你想要的部分。它们是处理列表字符串元组 这些有序数据的基石。

别小看这些基础操作,很多时候复杂的任务分解到最后,都离不开对数据某个局部的高效访问。掌握好 python怎么索引切片,你的代码会更简洁、更有效率。

别光看理论啊!赶紧打开你的 Python 解释器,或者 Jupyter Notebook,敲敲上面的代码,改改索引切片里的数字,看看结果是什么。试试那些“奇葩”的组合,比如 水果[5:1]水果[1:5:-1],看看会发生什么。那些看似错误或奇怪的结果,往往能让你对 索引切片 的规则理解得更透彻。特别是那个结束位置的“不包含”,多试几次,自然就刻在脑子里了。

这真的不是啥高深的魔法,就是一套跟序列打交道的规则。多练练,让你的手指和大脑都习惯从 0 开始,习惯那个左闭右开的切片范围,习惯负向索引 的便利。一旦这些成了你的本能反应,恭喜你,你在 Python 的路上又稳稳地迈了一大步。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。