Python字符串切片,如果包含字符串结尾的特殊情况?

时间:2014-01-30 18:03:16

标签: python slice

我是Python的新手,我发现切片行为有点令人困惑。

如果我这样做

test = 'abcdefgh'

for i in range(7):
    print test[-(8-i):-(6-i)]
    print i

最后一次迭代会行为不端。因为切片[start:end]不包括end,所以在我看来,如果最后一个字符在我想要的范围内,我需要使用特殊情况来处理这样的切片。

我错过了什么吗?

5 个答案:

答案 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