在不省略开始和结束切片的情况下反转Python字符串

时间:2015-03-28 00:51:33

标签: python reverse slice

如何在不省略开始和结束切片参数的情况下反转Python字符串?

word = "hello"
reversed_word = word[::-1]

我知道这有效,但是如何通过指定开始和结束索引来获得结果?

word = "hello"
reversed_word = word[?:?:-1]

很难向学生解释为什么word[::-1]会反转字符串。如果我能给他们逻辑推理而不是"它是pythonic方式"它会更好。

我解释word[::1]的方式如下:"您没有指定开始,所以它只是从头开始。你没有指定结束,所以直到结束。现在步骤为1,因此它从1开始到结束1个字符。"现在当我的学生看到word[::-1]时他们会想到"我们没有指定开头或结尾所以它一次会经过字符串-1个字符?"

7 个答案:

答案 0 :(得分:15)

其他一些反转字符串的方法:

word = "hello"
reversed_word1 = word[-1: :-1] 
reversed_word2 = word[len(word)-1: :-1]   
reversed_word3 = word[:-len(word)-1 :-1]    

关于切片符号a[i:j:k],您应该注意的一点是省略ij并不总是意味着i将成为{ {1}}和0将成为jIt depends upon the sign of k 的。默认情况下,len(s)k

  • 如果+1为+ ve,则默认值ki(从头开始)。如果是-ve则默认值0i(从结尾开始)。
  • 如果-1为+ ve,则k的默认值为j(结束时停止)。如果是-ve则默认值len(s)j(在开头停止)。

现在,您可以向学生解释-(len(s)+1)如何打印Hello[::-1]

答案 1 :(得分:13)

不太确定原因,但以下内容将返回word的反向:

word = "hello"
word[len(word):-(len(word)+1):-1]

或者...

word = "hello"
word[len(word):-len(word)-1:-1]

编辑(解释):

来自jedward的评论:

  

中间参数是最棘手的,但它非常简单   一旦你意识到(a)切片开始/停止指示的负指数   你要数数"倒退"从字符串的末尾,和(b)   止损指数是独家的,因此它会计算"计算"直到但停止   在停止指数处/之前。单词[len(word): - len(word)-1:-1]可能是   更清楚。

回复this评论:

第三个值实际上是增量,所以你告诉Python你想从最后一个字母开始,然后将所有(-1)st值返回到最后一个。

这是一张图(一分钟拉到一起): enter image description here

图纸显示我们也可以使用它:

word = "hello"
word[-1:-len(word)-1:-1] #-1 as the first

答案 2 :(得分:4)

如果没有为切片表示法指定数字,Python将使用None作为默认值。因此,您可以只显式写入None值:

>>> word = "hello"
>>> word[None:None:-1]
'olleh'
>>>

答案 3 :(得分:4)

Python 2 source开始,这是用三元表达式定义的:

defstart = *step < 0 ? length-1 : 0;
defstop = *step < 0 ? -1 : length;

所以,当没有给出开始和停止时,

如果步骤为否定:

  • start是length - 1
  • stop是-1,(这是C索引,在Python中实现很棘手,必须是-length-1)

如果步骤为肯定:

  • start is 0
  • stop is length

所以回答这个问题:

  

如何通过指定开始和结束索引来获得结果?

要自己指定,请使用例如以下(放入可重用功能)

def my_slice(word, step):
    '''slice word with only step'''
    start = len(word)-1 if step < 0 else 0
    stop = -len(word)-1 if step < 0 else len(word)
    return word[start:stop:step]


word = "hello"
step = -1
my_slice(word, step)

返回

'olleh'

答案 4 :(得分:3)

In [27]: word
Out[27]: 'hello'

In [28]: word[-1:-6:-1]
Out[28]: 'olleh'

为什么会这样:

In [46]: word
Out[46]: 'hello' 

In [47]: word[-1] # you want o to be your first value
Out[47]: 'o'

In [48]: word[-5] # you want h to be your last value
Out[48]: 'h'

In [49]: word[-1:-6:-1] # therefore ending point should be one
Out[49]: 'olleh'        # past your last value that is -6  

答案 5 :(得分:2)

可以使用以下Python程序描述符号string[begin:end:increment]

def myreverse( string, begin, end, increment ):
  newstring = ""
  if begin >= 0 and end < 0:
    begin = -1
  for i in xrange(begin, end, increment):
    try:
      newstring += string[i]
    except IndexError:
      pass

  return newstring

答案 6 :(得分:1)

递归方法:

def reverse(word):
    if len(word) <= 1:
        return word

    return reverse(word[1:]) + word[0]