Python 中如何进行逆序切片操作?

Python 的切片相信大家已经很熟悉了,语法是这样的

a[[start]:[end][:[step]]]

其中索引为 end 的元素不会被包括进来。startendstepstep 前面的冒号都可以省略。这么多可以省略的,那么解释器是怎么设置默认值的呢?很有趣,解释器对正序和逆序切片的默认值设置是不一样的,我们在实战中看结果吧。

全文用到的变量 a 长这样:

a="0123456789"

正序切片

在正序切片中,默认值的设置为

  • start = 0
  • end = -1 后面一位,即切片会返回包括 str 最后一个元素
  • step = 1

其中 end 的默认值为 -1 后面一位是什么意思呢?这里的 -1 指的是 index-1 的元素,即 str 的最后一个位置,在 a 中指的是 9 这个元素。那它后面一位是无意义的,但解释器执行的时候会切片到该元素的前一位,即 9

下面是几种正序切片的常见用例

a[:]
a[0:]
a[::]
a[::1]
a[0::1]
>>> '0123456789'

注意这里切片返回的结果不会包括索引为 -1 的元素

a[:-1]
>>> '012345678'
a[:8]
>>> '01234567'

a[8:] >>> ‘89’

a[:8:2] a[0:8:2] >>> ‘0246’

逆序切片 (step 为负数)

逆序切片的默认值就很有意思了,不注意的话非常容易混淆搞错边界索引,它的默认值是

  • start = -1
  • end = 0 前面一位,即切片会返回包括 str 第一个元素

这里的逻辑是,从 start 元素开始,在其索引上依次加上 step,找到下一个索引直到 end,所以写逆序切片的时候,start 的索引是大于 end 的索引的。

a
>>> '0123456789'

a[::-1] >>> ‘9876543210’

a[0::-1] >>> ‘0’

a[:0:-1] a[-1:0:-1] >>> ‘987654321’

a[4::-1] >>> ‘43210’

总结

其实不难反推出来,默认的值并不是写死的,而是根据 step 值来从 start 或者 end 二者之一来用加上 step 依次推导,直到队列最前 /最后一个元素的。如果不熟悉的话,逆序切片很容易在边界上出错,也不直观,不易理解,最好使用其他等效的操作来替代。

更多内容可以关注我的博客,主要分享生活、工作、读书中的一些心得感悟 http://blog.filosfino.com/


Python 中如何进行逆序切片操作?

8 回复

直接拉到最后看广告。


Python里逆序切片直接用负数步长就行。比如 [::-1] 就是整个序列倒过来。

看个例子:

# 字符串逆序
s = "hello"
print(s[::-1])  # 输出 "olleh"

# 列表逆序
lst = [1, 2, 3, 4, 5]
print(lst[::-1])  # 输出 [5, 4, 3, 2, 1]

# 部分逆序切片
print(lst[1:4][::-1])  # 输出 [4, 3, 2]
print(lst[4:1:-1])     # 输出 [5, 4, 3] 更高效

关键点:

  • 切片语法 [start:stop:step]
  • step=-1 时从右往左取元素
  • 不写起止点默认就是整个序列
  • 注意 start 要比 stop 大才能切出东西

更复杂的例子:

# 偶数索引位置逆序
lst = [0, 1, 2, 3, 4, 5, 6]
print(lst[::2][::-1])  # 输出 [6, 4, 2, 0]

# 逆序每隔两个取一个
print(lst[::-2])  # 输出 [6, 4, 2, 0]

记住 [::-1] 就行,其他都是在这个基础上变。

抓紧复习一波

熟知套路

在这里混的基本上没有小白,就你写的这东西的水平,就相当于在告诉大家母鸡会下蛋。
所以不要浪费论坛资源了。

这不都是基础知识嘛,看下官方文档就明白了。
新手最好直接看官方文档,网文质量参差不齐,还有很多皮毛,不连贯,都是碎片知识,很难系统学习。
讲真,现在给小白做培训真的很赚钱。

回到顶部