在Python中使用负数分割字符串时,是否禁用0?

在Python中使用负数分割字符串时,是否禁用0?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,假设我有一个字符串: >>>a = 'akwkwas' >>> >>>a[-3:] 'was' >>>a[-3:None] 'was' >>>a[-3:0] '' 为什么我不能使用0作为切片的结尾 这是来自文档: 记住切片工作原理的一种方法是将索引视为指向字符之间,第一个字符的左边缘编号为0。则n个字符字符串的最后一个字符的右边缘具有索引n,例如: 第一行数字给出了索引0…6在字符串中的位置;第二行给出了

假设我有一个字符串:

>>>a = 'akwkwas'
>>>
>>>a[-3:]
'was'
>>>a[-3:None]
'was'
>>>a[-3:0]
''
为什么我不能使用
0
作为切片的结尾

这是来自文档:

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

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

因此,当我们在循环中使用负索引时,我们应该检查end的值,因为负索引中的end
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

因为不能使用重复索引进行切片,因为字符串开头的索引是
0
,所以可能会导致混淆

假设您想要从前导到尾随得到一个切片,那么您应该执行以下操作:

my_string[0:0]  
返回一个空字符串

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

有关python切片的更多信息,请参见,因为-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]: ''

查看您的变量:

a='was'

您已经知道“w”位于位置0,同时也位于位置-3

当您编写
a[0:-3]
时,您告诉Python从索引0开始分割字符串,直到索引0为止

请记住,第二个参数告诉Python停止在哪个索引,而不包括哪个索引。排他的参数,其中第一个参数是包含的。

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

使用负指数也不是一种不同的模式;相对于长度,负指数转换为正指数。更改
0
所指的元素是没有意义的,因为另一个切片输入(开始或停止)是负数

由于
0
始终表示序列的第一个元素,并且负零没有拼写,因此不能使用
0
表示序列的结束

如果需要参数化索引,可以使用
None
作为
stop
元素来表示:

start = -3
stop = None
result = a[start:stop]
您还可以创建一个;同样的规则适用于指数的解释方式:

indices = slice(-3, None)
result = a[indices]
事实上,解释器将切片表示法转换为
slice()
对象,然后将该对象传递给该对象,以区别于使用单个整数的直接索引;
a[start:stop]
符号转换为
type(a)。\uuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuua,slice(start,stop))
a[42]
变成了
type(a)。\uu getitem\uuuuuuuuuuuuu42)


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

如果有机会切片到“负零”,则在循环中使用负切片是很无聊的,因为[:-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:0]
返回空列表的原因与此相同,例如
[5:2]
返回空列表的原因相同:“from”索引位于“to”索引之后。因为0是列表的开始索引。使用负跨步。切片无法向后工作。这是您想要的吗
a[-3::-1]
a[-3:0:-1]
0
不能同时表示两种不同的内容。负数是明确的,正如
None
一样。没有
-0
,这与
0
是一样的,所以你不能在一个负片中使用
0
,除非你突然改变
0
的含义。实际上看看这个
>a[-3:0:-1]'wk'>>a[1:3:-1]'>>a[1:3]'kw'>>a[-1:3]>>a[-1:3:-1]“saw”
我认为这是因为指数从正变为负,这只是一个例子。我有另一个例子,它表明使用负指数,如果更容易回答!在包含或不包含最后一个元素的特定情况下,如果includeLast-else为-1,则设置stop=None。这样我就不必添加可能未知的长度,因为这是一个TensorFlow张量,而不是Python列表。解决办法奏效了。谢谢!:-)
[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]