标题解释了如何从对象中获取2
slice(0,2)
文档有些混乱,或者是错误的
https://docs.python.org/2/c-api/slice.html
尤其是我不明白
slice(0,2).indices(0) # (0, 0, 1)
slice(0,2).indices(10 ** 10) # (0, 2, 1)
一种可能的解决方法是使用slice对象对列表进行切片
a = [1,2,3,4,5]
len(a[slice(0,2)]) # 2
但对于任意大的一块来说,这将失败。
谢谢,我在其他帖子里找不到答案。
Tags:
对此没有完整的答案。
slice
不提供长度,因为结果的长度始终取决于被切片序列的大小,短序列(包括空序列)将生成较少的项,如果slice
是无限的,则长度将随着序列的长度而增长;一个slice
可能只是通过一个start
或stop
的None
到达序列的末尾。为了快速简便地计算已知长度序列的长度,只需将} gives you the concrete ^{}, ^{} and ^{} values derived when a ^{} applies to a sequence of a given length ,基本上是您在C样式的
.indices
与Py3的range
(或Py2中的xrange
组合,尽管xrange
对Py3的值有限制,而Py3的值没有限制)。^{for
循环中填写的值,该循环与slice
循环遍历相同的索引:因此,要计算当应用于包含1000个元素的序列时
slice
的长度,您需要:如果您使用的是Python 2,并且您的值可能超过
xrange
可以处理的值(它仅限于ssize_t
可以容纳的边界和总长度),那么您只需手动进行计算:更新:不幸的是,} does to convert negative values and ^{} to concrete values based on the sequence length. 叹息。
slice.indices
本身不会接受超过long
所能容纳的序列的len
,因此这不会使您在Py2中使用xrange
获得任何好处。为那些感兴趣的人留下了位置,但是解决方法不会解决任何问题,除非你也perform the work ^{所以看起来
slice.indices(n)
返回要给range
的参数,以获得应该反映在长度序列n
的切片中的项索引(尽管没有文档化的编辑:正如@ShadowRanger指出的,它确实是documented)。因此,以下几行的计算值相同:如您所见,结果列表的长度与
range(*slice(1,15,3).indices(len(my_list)))
的长度相同,这取决于slice
对象本身以及要切片的序列的长度。这就是为什么len(range(*slice.indices(n)))
将在Python 3中给出正确的答案。(range对象是一个生成器,幸运的是它定义了__len__
函数,因此它可以提供项目计数,而无需枚举和计数它们。)如果在python 2中使用大数,可以按照@ShadowRanger的建议复制计算。
range.__len__
的原始实现如下:以及
slice.indices
:来源于svn
相关问题 更多 >
编程相关推荐