也许有人可以解释为什么特定切片操作要反转 字符串不起作用。必须有一些关于切片的东西我不知道 了解。基本操作: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'?
我在这里想念的是什么?
(我确实在逆转字符串上发现了很多帖子,但是如果这个特定的项目在某个地方被解释我错过了它)
答案 0 :(得分:6)
s[-1:-1:-1]
与
相同的原因不起作用s[0:0]
不会给你'abcd'。
切片时,指的是两个元素之间的空间,而不是这些元素的位置。所以你要求-1和-1之间的空格,即''。
答案 1 :(得分:3)
在
>>> s[-1:-1:-1]
>>> ''
start
和end
都是-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