3

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

给定

s='abcd'

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

s[::-1]

或者

s[-1::-1]

这些都很好,但为什么不

s[-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'?

我在这里想念什么?

(我确实看到了很多关于反转字符串的帖子,但是如果在某个地方解释了这个特定的项目,我就错过了)

4

6 回答 6

6
s[-1:-1:-1]

由于相同的原因不起作用

s[0:0]

不给你'abcd'。

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

于 2012-04-13T16:11:34.290 回答
3

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

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

尝试:

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

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

于 2012-04-13T16:10:51.077 回答
3

在这种情况下,负指数和非负指数是两个不同的类别:

  • 非负索引从头开始;
  • 负索引从末尾开始。

对我来说,切片的定义似乎很合乎逻辑,因此后者永远不会溢出到前者,正如您所说的那样:

它应该在 -1 之前下降到一个,即索引 0

于 2012-04-13T16:15:16.300 回答
1

你错过了切片的全部意义

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

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

你绝对应该开始阅读扩展切片

于 2012-04-13T16:12:15.747 回答
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'
于 2012-04-13T16:14:56.250 回答
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
于 2012-04-13T16:23:54.380 回答