假设我有一个字符串:
>>>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
答案 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]