我是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
期待在这种情况下如何处理负面步骤的一些解释。
答案 0 :(得分:7)
关键是缺少(或无)起始值并不总是自动设置为0。请阅读sequence operations中s[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]
相同。而且正如我在上文所述,如果不使用否定的步骤,我们就无法倒退(索引-3
到0
),因此它将返回空列表。
但是,当您以li[:-3:-2]
作为输入时,它将交换索引并变成li[-3::2]
,现在我们很容易知道输出是什么([7]
)。
因此,不要将[:-3:-2]
中的空格视为0
而是将其视为左端。(为了更好地理解)
希望这会有所帮助。