如何在不省略开始和结束切片参数的情况下反转Python字符串?
word = "hello"
reversed_word = word[::-1]
我知道这有效,但是如何通过指定开始和结束索引来获得结果?
word = "hello"
reversed_word = word[?:?:-1]
很难向学生解释为什么word[::-1]
会反转字符串。如果我能给他们逻辑推理而不是"它是pythonic方式"它会更好。
我解释word[::1]
的方式如下:"您没有指定开始,所以它只是从头开始。你没有指定结束,所以直到结束。现在步骤为1,因此它从1开始到结束1个字符。"现在当我的学生看到word[::-1]
时他们会想到"我们没有指定开头或结尾所以它一次会经过字符串-1个字符?"
答案 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]
,您应该注意的一点是省略i
和j
并不总是意味着i
将成为{ {1}}和0
将成为j
。 It depends upon the sign of k
的。默认情况下,len(s)
为k
。
+1
为+ ve,则默认值k
为i
(从头开始)。如果是-ve则默认值0
为i
(从结尾开始)。 -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值返回到最后一个。
这是一张图(一分钟拉到一起):
图纸显示我们也可以使用它:
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;
所以,当没有给出开始和停止时,
如果步骤为否定:
如果步骤为肯定:
所以回答这个问题:
如何通过指定开始和结束索引来获得结果?
要自己指定,请使用例如以下(放入可重用功能)
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]