我是Python的新手,我发现切片行为有点令人困惑。
如果我这样做
test = 'abcdefgh'
for i in range(7):
print test[-(8-i):-(6-i)]
print i
最后一次迭代会行为不端。因为切片[start:end]不包括end,所以在我看来,如果最后一个字符在我想要的范围内,我需要使用特殊情况来处理这样的切片。
我错过了什么吗?
答案 0 :(得分:1)
这里的问题是-0只是0,所以你试图抓住字符串的第一个字符
因此,对于i = 6的情况,你得到了
test[-2:0] = ''
更好的处理方法是展望未来
for i in range(len(test)-1):
print test[i:i+2]
从最终到工作的索引,正确的语法将省略0
test[-2:] = 'gh'
答案 1 :(得分:1)
你不能从-1开始并转到+1。 -1是结束,1是secund项目。你可以做到
for i in range(7):
....: print test[i:(2+i)]
....:
ab
bc
cd
de
ef
fg
gh
答案 2 :(得分:1)
如果你添加另外几张照片,你可以看到发生了什么:
test ='abcdefgh'
for i in range(7):
print -(8-i), -(6-i)
print test[-(8-i):-(6-i)]
print i
输出:
-8 -6
ab
0
-7 -5
bc
1
-6 -4
cd
2
-5 -3
de
3
-4 -2
ef
4
-3 -1
fg
5
-2 0
你的所有范围都是负数,直到最后一个为0
将or None
添加到结束范围将避免0
,并且就像您没有首先传递它一样:
for i in range(7):
print test[-(8-i):(-(6-i) or None)]
print i
哪个输出:
ab
0
bc
1
cd
2
de
3
ef
4
fg
5
gh
6
or
运算符的工作方式,如果第一个参数是“falsish”,则使用第二个参数,在本例中为None
答案 3 :(得分:0)
这确实是切片语义的不幸后果。
问题在于,要表示“从最后开始计数”,您需要传递一个负数,因此您不能要求“从最后开始计数0”,因为-0 == 0
不是负数。
为了从最后计算0个字符,你需要特殊情况if
或其他条件欺骗的问题,因为传递0
意味着“从一开始就有0个元素”。
要让它适用于这些情况,语义就必须如此
-4
表示从最后开始计算3(因此留下-1表示“从结尾开始的0”),但这可能是反直觉的。
能够说x[-n:]
表示字符串的最后n
个字符是一个更好的折衷方案,即使这对n == 0
不起作用,而不是你得到的空字符串完整的字符串。
答案 4 :(得分:0)
在Python教程(http://docs.python.org/2/tutorial/introduction.html)中,切片表示法定义为由冒号分隔的两个索引。
在示例的最后一次迭代中,切片表示法为[-2:0]。 -2是字符串倒数第二个字符的索引,0是字符串中第一个字母的索引。从第二个到最后一个字符切片到第一个字符是没有意义的。
如果你想从第二个字符到最后一个字符,只需删除第二个索引:[ - 2:]。也就是说,从第二个到最后一个角色开始并走到尽头。或者明确地说[-2:len(test)]。
对于这个例子,我建议如下:
test = 'abcdefgh'
for i in range(7):
start = -(8-i)
end = -(6-i)
# test your end condition
if end == 0:
end = None
print test[start:end]
print i