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

Oge*_*gen 20 python reverse slice

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

word = "hello"
reversed_word = word[::-1]
Run Code Online (Sandbox Code Playgroud)

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

word = "hello"
reversed_word = word[?:?:-1]
Run Code Online (Sandbox Code Playgroud)

很难向学生解释为什么要word[::-1]反转弦乐.如果我能给他们逻辑推理而不是"它是pythonic方式",那就更好了.

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

hac*_*cks 15

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

word = "hello"
reversed_word1 = word[-1: :-1] 
reversed_word2 = word[len(word)-1: :-1]   
reversed_word3 = word[:-len(word)-1 :-1]    
Run Code Online (Sandbox Code Playgroud)

您应该注意的切片符号的一件事a[i:j:k]是,省略ij并不总是意味着i将成为0j将成为len(s).这取决于的标志k.默认k+1.

  • 如果k是+已经那么的默认值i0(从头开始).如果它是-ve然后的默认值i-1(从端部开始).
  • 如果k是雾化+ ve然后的默认值jlen(s)(停止在端部).如果是-ve随后的默认值j-(len(s)+1)(在开始停止).

现在您可以向学生解释如何Hello[::-1]打印olleH.


jkd*_*jkd 13

不太清楚为什么,但以下将返回相反的word:

word = "hello"
word[len(word):-(len(word)+1):-1]
Run Code Online (Sandbox Code Playgroud)

要么...

word = "hello"
word[len(word):-len(word)-1:-1]
Run Code Online (Sandbox Code Playgroud)

编辑(说明):

来自jedward的评论:

中间参数是最棘手的,但是一旦你意识到(a)切片开始/停止的负索引表明你想要从字符串的末尾"向后"计数,并且(b)停止索引是独占的,它就非常简单了,所以它会"计数",但在停止指数处停止.单词[len(word): - len(word)-1:-1]可能更清楚.

回应评论:

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

这是一张图(一分钟拉到一起): 在此输入图像描述

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

word = "hello"
word[-1:-len(word)-1:-1] #-1 as the first
Run Code Online (Sandbox Code Playgroud)

  • 中间参数是最棘手的,但是一旦你意识到(a)切片开始/停止的负索引表明你想要从字符串的末尾"向后"计数,并且(b)停止索引是*独占的,它就非常简单了.*,因此它将"计数",但在停止索引处停止.`word [len(word): - len(word)-1:-1]`可能会更清楚一点. (3认同)
  • 甚至不用担心引用,只是扔在那里:) (2认同)
  • @Ogen,在Guido van Rossum的某个地方有一篇很好的博客文章,关于他如何决定切片符号 - 让我把它挖出来.编辑:这里:[为什么Python使用基于0的索引](http://python-history.blogspot.com/2013/10/why-python-uses-0-based-indexing.html) (2认同)
  • @jakekimds [这是一个要点](https://gist.github.com/jheiv/1d0efd0a0bc39e73bffd),它给出了一种可以实现实际切片的方法,给定一个可迭代的(在本例中是一个字符串)和一个切片对象.最后两个切片是您可能感兴趣的切片.倒数第二个片段是你给出的答案(`[LEN(文本): - LEN(文本)-1:-1]`),最后的答案具有相同的启动和停止,但没有一步.当没有提供一步,则默认为1,循环尝试算进,但它已经过去**起始于`LEN(文本)字符串的结束',所以它会立即停止. (2认同)

Aar*_*all 4

Python 2源代码,这是用三元表达式定义的:

defstart = *step < 0 ? length-1 : 0;
defstop = *step < 0 ? -1 : length;
Run Code Online (Sandbox Code Playgroud)

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

如果步骤是否定的:

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

如果步骤是肯定的:

  • 开始是0
  • 停止是长度

所以回答这个问题:

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

要自己指定,请使用以下(放入函数以获得可重用性)

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)
Run Code Online (Sandbox Code Playgroud)

回报

'olleh'
Run Code Online (Sandbox Code Playgroud)