搜索
您的当前位置:首页正文

2018-10-28 028 切片进阶 A

来源:二三娱乐

在前面这些基本的语法知识里,其实本菜鸡最模糊也不常用的就是序列切片,原因很简单,仅就我学习C++的经历来看,切片算是一种比较陌生的方法——或者干脆说,是种比较陌生的思想。其实编程的很多问题也是这样,有时候并不是语法知识不清晰,如果真的是这样,那直接Google一下就好了,很多时候我们的小项目陷入困境主要原因是对程序的实现逻辑没有考虑清晰,而一些LeetCode上的小题目做不出来,很有可能是压根没想到“那种方法”,没错,就是那种你隐隐约约知道是什么,却不太清楚是怎么回事的做法。
毫无疑问,切片对于我来说,就属于“那种方法”。
这一部分主要说一说切片的进阶使用,至于这些结果是怎么产生的,后放。

反向切片

在前面的“卧槽类型”里,陆陆续续介绍了一些切片的知识,这里就做一个小小的总结。众所周知,我们可以用S[a:b:c]的方式对S在以a到b的范围内做c为间隔的切片,而且c的数值还可以取负,即,反向取值。

str = "abcdefghijklmn"
print(str[::3])
print(str[::-1])
print(str[::-2])
# 结果如下:
adgjm
nmlkjihgfedcba
nljhfdb
长表实在不想做了.png
多维切片
Lis = [
    [10,11,12,13,14,15],
    [20,21,22,23,24,25],
    [30,31,32,33,34,35],
    [40,41,42,43,44,45],
    [50,51,52,53,54,55],
    [60,61,62,63,64,65]
]
print(Lis[2:5][0:2])

本菜鸡大言不惭地写了这一段,因为这根本不是本质上的多维切片,而只能算是一种,emmmmmm,二次切片,首先在程序里我们搞出来一个以列表为元素的列表,形成了一个二维的矩阵,然后用切片处理它,但按照我们基本的思考逻辑,希望的是有点类似线性代数里讲解的「分块矩阵」,切出来一个m行n列的子矩阵,而不是像现在这样:

[[30, 31, 32, 33, 34, 35], [40, 41, 42, 43, 44, 45]]

这段程序实际上执行的是先切出一个Lis的第三第四第五个元素,在在这个序列里切出来第一第二个,所以,本质上是一种“二次切片”。
实际上的二维切片是这样的——

a[m:n ,k:l]

但是本菜鸡一运行这行代码就TypeError: list indices must be integers or slices, not tuple,原因也很简单,这个方法某种程度上是专属于Numpy的,但是书里大略说了一句“二维的numpy.ndarry就可以用(这样的方式)来得到二维切片”——坑爹啊,技术性文章的意思果然还是要实践出真知,毕竟有时候,翻译也是一种模糊化,在中文的意思里“就可以”这三个字表达的内在含义有点太无法可说了。
注意,Python内置的序列类型都是一维的,因此,所有成对出现的索引都make no sense

多说几句

成果成果,成果你老母啊——它名字叫成,又不是真的书上长的,浇水施肥就能摘……

Top