当使用负数在Python中切割字符串时,0被禁用?

时间:2015-07-31 07:17:03

标签: python python-2.7 python-3.x

假设我有一个字符串:

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

为什么我不能使用0作为切片的结尾?

这是来自docs:

  

记住切片如何工作的一种方法是将索引视为指向字符之间,第一个字符的左边缘编号为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

5 个答案:

答案 0 :(得分:5)

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

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

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

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

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

您还可以创建slice() object;相同的规则适用于如何解释索引:

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)

因为您不能使用重复索引进行切片,因为字符串开头的索引是0,这可能会引起混淆。

假如你想要从结尾处获得一个切片,那么你应该这样做:

my_string[0:0]  

返回一个空字符串。

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

有关python切片的更多信息,请参阅https://docs.python.org/2.3/whatsnew/section-slices.html

答案 2 :(得分: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]: ''

答案 3 :(得分:0)

查看你的变量:

a = 'was'

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

当你写a[0:-3]告诉Python切片从索引0开始的字符串并转到直到索引0。

请记住,第二个参数告诉Python哪个索引停止而不包含。 exclusive 中的那个参数,其中第一个参数是 inclusive

答案 4 :(得分:0)

如果有机会切换到“负零”,则在循环中使用负片非常无聊,因为[:-0]不会被解释为预期。

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

E.g。负片循环:

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]