使用负数对字符串进行切片时,为什么0被禁用?

问题描述 投票:0回答:5

假设我有一根绳子:

>>>a = 'akwkwas'
>>>
>>>a[-3:]
'was'
>>>a[-3:None]
'was'
>>>a[-3:0]
''

为什么我不能使用

0
作为切片的结尾?

这来自文档:

记住切片工作原理的一种方法是将索引视为指向字符之间,第一个字符的左边缘编号为 0。然后,n 个字符的字符串的最后一个字符的右边缘具有索引 n,例如:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

第一行数字给出了索引 0...6 在字符串中的位置;第二行给出相应的负索引。从 i 到 j 的切片由分别标记为 i 和 j 的边之间的所有字符组成。

因此,当我们在循环中使用负索引时,我们应该检查末尾的值,因为负索引中的末尾

0
不存在,例如当我们将一个字符串拆分为类似金钱的字符串时:

>>>a = '12349878334'
>>>print(','.join([a[-i-3:-i if i else None] for i in range(0, len(a), 3)][::-1])) 
>>>12,349,878,334
python indexing slice
5个回答
7
投票

0
序列的开始。始终、毫不含糊。有时将其含义更改为结尾会导致很多混乱,尤其是在对这两个值使用变量时。

使用负索引也不是一种不同的模式;负索引转换为相对于长度的正索引。更改

0
所指的元素是因为 other 切片输入(开始或停止)是负数,这是没有意义的。

因为

0
始终表示序列的第一个元素,并且没有负零的拼写,所以不能使用
0
表示序列的结尾。

如果您需要参数化索引,您可以使用

None
作为
stop
元素来表示这一点:

start = -3
stop = None
result = a[start:stop]

您还可以创建一个

slice()
对象;相同的规则适用于如何解释指数:

indices = slice(-3, None)
result = a[indices]

事实上,解释器将切片符号转换为

slice()
对象,然后将其传递给该对象以区别于使用单个整数的直接索引;
a[start:stop]
符号转换为
type(a).__getitem__(a, slice(start, stop))
,而
a[42]
则变为
type(a).__getitem__(a, 42)

因此,通过使用

slice()
对象,您可以使用单个变量记录切片或单元素索引。


1
投票

如果有机会切片为“负零”,则在循环中使用负切片很无聊,因为 [:-0] 未按预期解释。

但是有一个简单的方法可以解决这个问题,只需通过添加容器的长度将负索引转换为正索引即可。

例如负切片循环:

a = np.arange(10)
for i in range(5):
    print(a[5-i:-i])

答案:

[]
[4 5 6 7 8]
[3 4 5 6 7]
[2 3 4 5 6]
[1 2 3 4 5]

通过添加长度转换为正值:

for i in range(5):
    print(a[5-i:len(a)-i])

得到正确答案:

[5 6 7 8 9]
[4 5 6 7 8]
[3 4 5 6 7]
[2 3 4 5 6]
[1 2 3 4 5]

0
投票

因为-3与4相同,大于0:

In [8]: a = 'akwkwas'

In [9]: a[-3:]
Out[9]: 'was'

In [10]: a[4:]
Out[10]: 'was'

In [11]: a[4:0]
Out[11]: ''

0
投票

查看你的变量:

a = 'was'

您已经知道 'w' 位于位置 0,它也位于位置 -3。

当你写

a[0:-3]
时,告诉 Python 从索引 0 开始对字符串进行切片,直到 索引 0。

请记住,第二个参数告诉 Python 停止而不包含哪个索引。

exclusive 中的参数,其中第一个参数是 inclusive


0
投票
因为您不能使用重复的索引进行切片,因为字符串开头的索引是

0

,这可能会导致混乱。

假设如果你想从前导到尾随得到一个切片,那么你应该这样做:

my_string[0:0]

返回一个空字符串。

>>> my_string='example' >>> my_string[0:0] '' >>>

有关 python 切片的更多信息,请参阅

https://docs.python.org/2.3/whatsnew/section-slices.html

© www.soinside.com 2019 - 2024. All rights reserved.