假设我有一根绳子:
>>>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
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()
对象,您可以使用单个变量记录切片或单元素索引。
如果有机会切片为“负零”,则在循环中使用负切片很无聊,因为 [:-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]
因为-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 停止而不包含哪个索引。 exclusive 中的参数,其中第一个参数是 inclusive。