切片算子的负界

时间:2018-11-25 05:50:09

标签: python slice

我是python的新手,每个新手遇到的事情之一就是slice运算符。我有一个清单:

ImportError:
Importing the multiarray numpy extension module failed.  Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control).  Otherwise reinstall numpy.

Original error was: DLL load failed: The specified module could not be found.

根据我的理解,调用li=[1,2,3,4,5,6,7] 与调用li[:-1]相同,但是使用否定步骤进行操作时,事情并没有完全按照我的预期工作。所以我要问为什么

的结果
li[0:-1]

但结果

print(li[:-3:-2]) # is 7

期待在这种情况下如何处理负面步骤的一些解释。

2 个答案:

答案 0 :(得分:7)

关键是缺少(或无)起始值并不总是自动设置为0。请阅读sequence operationss[i:j:k]的注5

  

如果省略i或j或“无”,它们将成为“结束”值(结束于   取决于k的符号)

为简化这种情况,请考虑否定步骤-1而不是-2。步骤-1通常用于反转列表。

>>> print(li[None:-3:-1])
[7, 6]
>>> print(li[0:-3:-1])
[]

第一个示例显示了切片的实际“最终值”是什么。

答案 1 :(得分:2)

因此,您的列表为li=[1,2,3,4,5,6,7]

首先,了解切片过程中到底发生了什么。

不使用分步就无法向后切片

举个例子,我们不会打印[7, 6, 5, 4, 3, 2],我们不能使用li[-1:0]来打印。因为,切片无法按照规定进行倒退(我们不能从索引-1倒退到0),并且会返回空列表[]。(我们必须使用li[-1:0:-1])< / p>

所以这里发生的是:

您有一个列表li[x:y],使用否定步骤会将索引交换为li[y:x]。(一旦完成索引交换,则应将其视为肯定步骤),然后打印出输出wrt您提供的步长(仅幅度)。

现在,我上面提到的所有内容似乎都没有用,但可以帮助您理解下一部分。

因此,提一个问题,当您编写li[0:-3:-2]时,首先会交换索引。因此,它与li[-3:0:2]相同。而且正如我在上文所述,如果不使用否定的步骤,我们就无法倒退(索引-30),因此它将返回空列表。

但是,当您以li[:-3:-2]作为输入时,它将交换索引并变成li[-3::2],现在我们很容易知道输出是什么([7])。

因此,不要将[:-3:-2]中的空格视为0而是将其视为左端。(为了更好地理解)

希望这会有所帮助。