为什么[-1:-1:-1]不能用于反转字符串?

时间:2012-04-13 16:05:51

标签: python string slice

也许有人可以解释为什么特定切片操作要反转 字符串不起作用。必须有一些关于切片的东西我不知道 了解。基本操作:s [start:end:step]

鉴于

s='abcd'

要反转此字符串,我可以使用默认值

s[::-1]

s[-1::-1]

这些都很好,但为什么不呢

s[-1:-1:-1]

工作,并给我整个字符串逆转?它应该从一开始 字符串中的最后一个字符为(-1),步长为-1。它应该运行 在-1之前降至1,即指数0.相反,我得到''。

for i in xrange(3, -2, -1):
    print 's[-1:%d:-1] => ' %i,
    print s[-1:i:-1]

的产率:

s[-1:3:-1] =>     # didn't expect any output
s[-1:2:-1] =>  d
s[-1:1:-1] =>  dc
s[-1:0:-1] =>  dcb
s[-1:-1:-1] =>    # shouldn't this be 'dcba'?

我在这里想念的是什么?

(我确实在逆转字符串上发现了很多帖子,但是如果这个特定的项目在某个地方被解释我错过了它)

6 个答案:

答案 0 :(得分:6)

s[-1:-1:-1]

相同的原因不起作用
s[0:0]

不会给你'abcd'。

切片时,指的是两个元素之间的空间,而不是这些元素的位置。所以你要求-1和-1之间的空格,即''。

答案 1 :(得分:3)

>>> s[-1:-1:-1]
>>> ''

startend都是-1所以它们是相同的。切片将数组中的每个元素从start转换为end,因为每次增加step。如果它已经到达end,则切片结束...因此它返回''

尝试:

>>> s[1:1:1]
>>> ''

这可能有助于这更有意义,因为它几乎是一样的,但是积极的。

答案 2 :(得分:3)

在这种情况下,负面和非负面指数是两个独立的类别:

  • 非负指数从头开始;
  • 负面指数从最后开始。

对我而言,切片的定义使得后者永远不会溢出前者似乎是合乎逻辑的,正如你所说的那样,你似乎期待:

  

它应该在-1之前运行到1,即索引0

答案 3 :(得分:1)

你错过了切片的全部内容

[start:end:stride]是切片运算符的样子

如果步幅为负,那么当你从高位移动到低位时,你的开始肯定会大于结束。所有失败的例子都违反了这一点。

你一定要开始阅读Extended Slicing

答案 4 :(得分:1)

您不能指望-1表示两者字符串中的最后一项和字符串中第一项之前的“项目”。这将是不一致的。

也许您正在想象Python将字符串视为循环,并将-1视为同时是“{之前的项目”0以及字符串中的最后一项。但事实并非如此。例如,如果是这种情况,那么这将成立:

'abcd'[-2:-1:-1] == 'cbad'

但事实并非如此。结果只是空字符串。

>>> 'abcd'[-2:-1:-1] 
''

字符串切片中负数索引的正确解释是从字符串末尾开始的反向索引,而不是0的循环索引。

作为进一步的思考,请考虑以下因素:

a = 'abcd'
a[-1:-(len(a) + 0):-1] == 'dcb'
a[-1:-(len(a) + 1):-1] == 'dcba'
a[-1:-(len(a) + 2):-1] == 'dcba'

答案 5 :(得分:1)

那有点不幸,不是吗?这是一个尴尬的解决方法。

for i in range(3, -2, -1):
    j = i if i != -1 else None
    print 's[-1:%s:-1] => ' % str(j),
    print s[-1:j:-1]

s[-1:3:-1] =>  
s[-1:2:-1] =>  d
s[-1:1:-1] =>  dc
s[-1:0:-1] =>  dcb
s[-1:None:-1] =>  dcba

这是同一件事的变体。我不确定它是否不那么尴尬。

for i in range(3, -1, -1) + [None]:
    print 's[-1:%s:-1] => ' % str(i),
    print s[-1:i:-1]

s[-1:3:-1] =>  
s[-1:2:-1] =>  d
s[-1:1:-1] =>  dc
s[-1:0:-1] =>  dcb
s[-1:None:-1] =>  dcba