天道酬勤,学无止境

Reverse string Python slice notation

string = "HELLO"
print string[::-1] #as expected
print string[0:6:-1] #empty string why ?

I was amazed to see how easy it is to reverse a string in python but then I struck upon this and got lost. Can someone please explain why the second reverse does not works ?

评论

The reason the second string is empty is because you are telling the compiler to begin at 0, end at 6 and step -1 characters each time.

Since the compiler will never get to a number bigger than six by repeatedly adding -1 to 0 (it goes 0, -1, -2, -3, ...) the compiler is programmed to return an empty string.

Try string[6::-1], this will work because repeatedly adding -1 to 6 will get to -1 (past the end of the string).

Note: this is answer is mainly a compilation of @dmcdougall, @Ben_Love and @Sundeep's comments with a bit more explanation

Slice notation is written as follows:

list_name[start_index: end_index: step_value]

The list indexes in python are not like the numbers present on number line. List indexes does not go to -1st after 0th index when step_value is -1.

Hence below results are produced

>>>> print string[0:6:-1]

>>>>

And

>>>> print string[0::-1]

>>>> H

So when the start_index is 0, it cant go in a cyclic order to traverse the indexes to -1, -2, -3, -4, -5, -6 for step_value is -1.

Similarly

>>>> print string[-1:-6:-1]

>>>> OLLEH

and

>>>> print string[-1::-1]

>>>> OLLEH

also

thus when the start_index is -1 it goes in a cyclic order to traverse the indexes to -1, -2, -3, -4, -5, -6 to give output OLLEH.

Its pretty straight forward to understand when start_index is 6 and step_value is -1

>>>> print string[6::-1]

>>>> OLLEH

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to explain the reverse of a sequence by slice notation a[::-1]
    From the python.org tutorial Slice indices have useful defaults; an omitted first index defaults to zero, an omitted second index defaults to the size of the string being sliced. >>> a = "hello" >>> print(a[::-1]) olleh As the tutorial says a[::-1] should equals to a[0:5:-1] but a[0:5:-1] is empty as follows: >>> print(len(a[0:5:-1])) 0 The question is not a duplicate of explain-slice-notation. That question is about the general use of slicing in python.
  • 如何通过切片符号a [::-1]解释序列的逆向(How to explain the reverse of a sequence by slice notation a[::-1])
    问题 来自python.org教程 切片索引具有有用的默认值。 省略的第一索引默认为零,省略的第二索引默认为要切片的字符串的大小。 >>> a = "hello" >>> print(a[::-1]) olleh 如本教程所述, a[::-1]等于a[0:5:-1] 但是a[0:5:-1]为空,如下所示: >>> print(len(a[0:5:-1])) 0 这个问题不是explain-slice-notation的重复。 这个问题与python中切片的一般用法有关。 回答1 我认为文档对此可能有点误导,但是切片的可选参数(如果省略)与使用None相同: >>> a = "hello" >>> a[::-1] 'olleh' >>> a[None:None:-1] 'olleh' 您可以看到上述两个切片与CPython字节码相同: >>> import dis >>> dis.dis('a[::-1]') # or dis.dis('a[None:None:-1]') 1 0 LOAD_NAME 0 (a) 3 LOAD_CONST 0 (None) 6 LOAD_CONST 0 (None) 9 LOAD_CONST 2 (-1) 12 BUILD_SLICE 3 15 BINARY_SUBSCR 16 RETURN_VALUE 对于负step ,对于取代的值None被len
  • 了解切片符号(Understanding slice notation)
    问题 我需要一个关于Python的切片符号的很好的解释(引用是一个加号)。 对我而言,此表示法需要一些注意。 它看起来非常强大,但是我还没有完全了解它。 回答1 真的很简单: a[start:stop] # items start through stop-1 a[start:] # items start through the rest of the array a[:stop] # items from the beginning through stop-1 a[:] # a copy of the whole array 还有step值,可以与以上任何一个一起使用: a[start:stop:step] # start through not past stop, by step 要记住的关键点是:stop值表示不在所选切片中的第一个值。 因此, stop和start之间的差异是所选元素的数量(如果step为1,则为默认值)。 另一个功能是start或stop可以是负数,这意味着它是从数组的末尾而不是开头开始计数。 所以: a[-1] # last item in the array a[-2:] # last two items in the array a[:-2] # everything except the last two items 同样,
  • Python中的方括号和点表示法之间有什么区别?(What's the difference between the square bracket and dot notations in Python?)
    问题 我来自Javascript背景(可以同时通过.和[]表示法访问属性),因此请原谅我,但是Python中两者之间的区别到底是什么? 从我的实验来看,似乎应该总是使用[] ,既要获取list或set的索引,又要从dictionary的某个键获取值。 这是正确的吗?如果不正确,何时使用. 在Python中? 回答1 点运算符用于访问任何对象的属性。 例如,复数 >>> c = 3+4j (除其他外)具有real和imag这两个属性: >>> c.real 3.0 >>> c.imag 4.0 除此之外,它还有一个方法conjugate() ,它也是一个属性: >>> c.conjugate <built-in method conjugate of complex object at 0x7f4422d73050> >>> c.conjugate() (3-4j) 方括号表示法用于访问集合的成员,无论是字典还是其他映射,都是通过键访问的: >>> d = {'a': 1, 'b': 2} >>> d['a'] 1 ...或在列表或字符串之类的序列的情况下按索引: >>> s = ['x', 'y', 'z'] >>> s[2] 'z' >>> t = 'Kapow!' >>> t[3] 'o' 这些集合还分别具有以下属性: >>> d.pop <built-in method
  • 了解负片步进值[重复](understanding negative slice step value [duplicate])
    问题 这个问题已经在这里有了答案: 了解切片符号(33个答案) 7年前关闭。 我在理解如果在切片时将负值放在台阶上会发生什么,这是一个问题。 我知道[::-1]反转一个字符串。 我想知道它分配给开始和停止的值是什么,以得到相反的结果。 我以为结束字符串将是0。 并尝试 f="foobar" f[0:5:-1]--->它没有输出。 为什么? 而且我已经读过开始不应该通过停止。 在负步长值的情况下也是如此吗? 谁能帮助我清除我的疑问。 回答1 f[0:5:-1]不生成任何输出的原因是因为您从0开始,并试图倒数至5。这是不可能的,因此Python返回一个空字符串。 相反,您需要f[5:0:-1] ,它返回字符串"raboo" 。 请注意,该字符串不包含f字符。 为此,您需要f[5::-1] ,它返回字符串"raboof" 。 您还问: 我已阅读开始不应该通过停止。 在负步长值的情况下也是如此吗? 不,那不是真的。 通常情况下, start值应不通过stop值,但只有当步是积极的。 如果步长为负,则相反。 在start必须根据需要,必须高于stop值。 回答2 您可以这样认为: 当f[0:5] , 0是开始位置,而5-1是结束位置。 当f[0:5:-1] , 5是开始位置, 0+1是结束位置。 切片时,开始位置必须低于结束位置。 如果不是这种情况,则结果为空字符串。 因此, f[0:5
  • 实现python切片符号(Implementing python slice notation)
    问题 我正在尝试用另一种语言 (php) 重新实现 python 切片符号,并寻找一个可以模仿 python 逻辑的片段(任何语言或伪代码)。 也就是说,给定一个列表和一个三元组(start, stop, step)或其中的一部分,确定所有参数的正确值或默认值,并将切片作为新列表返回。 我尝试查看来源。 该代码远远超出了我的 C 技能,但我不禁同意以下评论: /* this is harder to get right than you might think */ 此外,如果这样的事情已经完成,将不胜感激。 这是我的测试平台(确保您的代码在发布前通过): #place your code below code = """ def mySlice(L, start=None, stop=None, step=None): or <?php function mySlice($L, $start=NULL, $stop=NULL, $step=NULL) ... or function mySlice(L, start, stop, step) ... """ import itertools L = [0,1,2,3,4,5,6,7,8,9] if code.strip().startswith('<?php'): mode = 'php' if code.strip()
  • 下标序列时,Python中的::(双冒号)是什么?(What is :: (double colon) in Python when subscripting sequences?)
    问题 我知道我可以使用string[3:4]类的东西来获取Python中的子字符串,但是3在somesequence[::3]是什么意思somesequence[::3] ? 回答1 它的意思是“第一个参数不加任何内容,第二个参数不加任何内容,然后跳三”。 它获取序列中每隔三分之一的内容。 扩展片就是您想要的。 Python 2.3的新功能 回答2 可以将Python序列切片地址写为[start:end:step],并且可以删除开始,停止或结束中的任何一个。 a[::3]是序列的每三个元素。 回答3 seq[::n]是整个序列中每个第n个项目的序列。 例子: >>> range(10)[::2] [0, 2, 4, 6, 8] 语法为: seq[start:end:step] 因此,您可以执行以下操作(在Python 2中): >>> range(100)[5:18:2] [5, 7, 9, 11, 13, 15, 17] 回答4 解释 根据文档, s[i:j:k]为“从步骤i到j的s切片”。 当i和j不存在时,将假定整个序列,因此s[::k]表示“第k个项目”。 例子 首先,让我们初始化一个列表: >>> s = range(20) >>> s [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
  • 获取列表的最后一个元素(Getting the last element of a list)
    问题 在Python中,如何获取列表的最后一个元素? 回答1 some_list[-1]是最短和最Python的语言。 实际上,您可以使用此语法做更多的事情。 some_list[-n]语法获取第n个元素。 所以some_list[-1]获取最后一个元素, some_list[-2]获取倒数第二个, some_list[-2] ,一直到some_list[-len(some_list)] ,它为您提供了第一个元素。 您也可以通过这种方式设置列表元素。 例如: >>> some_list = [1, 2, 3] >>> some_list[-1] = 5 # Set the last element >>> some_list[-2] = 3 # Set the second to last element >>> some_list [1, 3, 5] 请注意,如果期望的项目不存在,则按索引获取列表项将引发IndexError。 这意味着,如果some_list为空,则some_list[-1]将引发异常,因为空列表不能包含最后一个元素。 回答2 如果您的str()或list()对象最终可能是空的: astr = ''或alist = [] ,则可能要对对象“使用alist[-1:]而不是alist[-1]相同”。 这样做的意义是: alist = [] alist[-1] #
  • 在Swift中,最简单的方法来获取数组中的最后两项?(In Swift, what's the cleanest way to get the last two items in an Array?)
    问题 有没有一种更干净的方法来获取Swift中数组的最后两项? 通常,我尝试避免使用这种方法,因为与索引一一对应很容易。 (在此示例中使用Swift 1.2。) // Swift -- slices are kind of a hassle? let oneArray = ["uno"] let twoArray = ["uno", "dos"] let threeArray = ["uno", "dos", "tres"] func getLastTwo(array: [String]) -> [String] { if array.count <= 1 { return array } else { let slice: ArraySlice<String> = array[array.endIndex-2..<array.endIndex] var lastTwo: Array<String> = Array(slice) return lastTwo } } getLastTwo(oneArray) // ["uno"] getLastTwo(twoArray) // ["uno", "dos"] getLastTwo(threeArray) // ["dos", "tres"] 我希望有一些更接近Python便利性的东西。 ## Python -- very
  • Python编程:从入门到实践
    Python编程:从入门到实践 ==Appendix 1.代码规范==1.1函数编写规范函数名使用小写字母和单词之间下划线。应给函数指定描述性名称。模块命名也是每个函数应有简要的DocStrings注释DocStrings 文档字符串 给形参指定默认值时,等号两边不要有空格,对于函数调用中的关键字实参,也应遵循这种约定:在左括号后换行,是函数形参过长的处理办法。每行代码长度不要超过这根竖线 1.2 类编写规范类的名称每个单词首字母大写且不使用下划线,实例名和模块名都采用小写格式,并在单词之间加上下划线。每个类紧跟定义后包含一个文档字符串描述类的功能 可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,再添加一个空行,然后编写导入你自己编写的模块的import 语句。 1.3 测试类、测试函数编写规范类名包含字样Test方法名必须以test_打头,这样它才会在我们运行test_name_function.py时自动运行。 1.4 通过空行,划分程序1.5 输入输出message=input("please input your name: ")冒号后要有个空格打印的内容太长,如何拆分 Chapter 2 变量2.3字符串‘.....’,"......",#字符串,单引号,双引号都可以
  • Python入门笔记:语言基础篇(字符串与“数组”)
    slogan: 我学编程就是为了赚钱,后来发现它不只是能赚钱… 本文目录 1.字符串1.1 字符串的转义1.2 字符串的运算1.3 用`%`来格式化字符串1.4 用内置方法处理字符串 2. Python里的“数组”2.1 列表 List2.2 元组 Tuple2.3 集合 Set2.4 字典 Dict 1.字符串 所谓字符串,就是由零个或多个字符组成的有限序列。在Python中,单个或多个字符用单引号或者双引号包围起来,就可以表示一个字符串。 s1 = 'hello, world!' s2 = "hello, world!" # 以三个双引号或单引号开头的字符串可以折行 s3 = """ hello, world! """ print(s1, s2, s3, end='') 1.1 字符串的转义 在字符串中使用\(反斜杠)来表示转义,也就是说\后面的字符不再是它原来的意义,例如:\n表示换行;\t表示制表符。所以如果想在字符串中表示'要写成\',同理想表示\要写成\\。 在\后面还可以跟一个八进制或者十六进制数来表示字符,例如\141和\x61都代表小写字母a,前者是八进制的表示法,后者是十六进制的表示法。也可以在\后面跟Unicode字符编码来表示字符。 转义字符描述\(在行尾时)续行符\\反斜杠符号\'单引号\"双引号\a响铃\b退格(Backspace)\e转义\000空
  • 扩展切片语法实际上对负步骤有什么作用? [复制](What does extended slice syntax actually do for negative steps? [duplicate])
    问题 这个问题在这里已经有了答案: 理解切片符号(33 个回答) 8 年前关闭。 python 中的扩展切片语法已经向我解释为“ a[n:m:k] returns every kth element from n to m ”。 这让我很清楚当 k 为正时会发生什么。 但是我不知道如何解释负 k 的a[n:m:k] 。 我知道a[::-1]反转 a,并且a[::-k]取反转 a 的第 k 个元素。 但是,这是对 k 正的定义的概括吗? 我想知道a[n:m:k]实际上是如何定义的,以便(例如)我可以理解为什么: "abcd"[-1:0:-1] = "dcb" a[n:m:-k]反转序列 a,然后取原始索引从 n 开始并在 m 之前结束的元素? 我不这么认为,因为这种模式不适合我尝试过的 n 和 m 的其他值。 但是我无法弄清楚这实际上是如何定义的,而搜索却一无所获。 回答1 [-1:0:-1]表示:从索引len(string)-1 ,向上移动到0 (不包括在内)并采取-1 (反向)的步骤。 因此,获取以下索引: le-1, le-1-1, le-1-1-1 .... 1 # le is len(string) 例子: In [24]: strs = 'foobar' In [25]: le = len(strs) In [26]: strs[-1:0:-1] # the first
  • list.reverse()无法正常工作(list.reverse() is not working [duplicate])
    问题 这个问题已经在这里有了答案: 无法在Python中反转列表,将“ Nonetype”作为列表(3个答案) 4年前关闭。 老实说,我只是不明白为什么这会返回None而不是返回的列表: >>> l = range(10) >>> print l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print l.reverse() None 为什么会这样呢? 根据文档,我没有做错任何事情。 回答1 reverse修改该列表并返回None 。 如果你这样做 l.reverse() print l 您将看到您的列表已被修改。 回答2 L.reverse()修改L。 通常,Python内置方法将变异或返回某些内容,但不会同时发生 反转列表的通常方法是使用 print L[::-1] reversed(L)返回一个listreverseiterator object ,该listreverseiterator object可以进行迭代,但是如果您真的想要一个列表,则效果不是很好 [::-1]只是一个普通切片-步骤为-1因此您将获得从头到尾并从头到尾的副本 回答3 list.reverse()可以在适当位置反转列表。 它不返回反向列表。 为此,请使用reversed()函数: print reversed(l) 或只使用扩展的切片符号: print l[::-1] 回答4
  • 反转熊猫DataFrame的正确方法?(Right way to reverse a pandas DataFrame?)
    问题 这是我的代码: import pandas as pd data = pd.DataFrame({'Odd':[1,3,5,6,7,9], 'Even':[0,2,4,6,8,10]}) for i in reversed(data): print(data['Odd'], data['Even']) 当我运行此代码时,出现以下错误: Traceback (most recent call last): File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 665, in _get_item_cache return cache[item] KeyError: 5 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\*****\Documents\******\********\****.py", line 5, in <module> for i in reversed(data): File "C:\Python33\lib\site-packages\pandas\core\frame.py", line
  • 反转python中的列表切片(Reversing a list slice in python)
    问题 我试图在python中反转列表的切片,但它返回一个空列表。 但是,当我尝试使用整个列表时,效果很好。 我在这里想念什么吗? l=[1,2,3,4,5,6,7,8] l[::-1]=[8, 7, 6, 5, 4, 3, 2, 1] <<< This worked fine. l[2:5]=[3, 4, 5] l[2:5:-1]=[] <<< Expecting [5,4,3] here. 有什么线索吗? 回答1 语法始终为[start:end:step]因此,如果向后移动,则开始位置必须大于结束位置。 还要记住,它包括开始,但不包括结束,因此交换开始和结束后需要减去1。 l[5:2:-1]= [6, 5, 4] l[4:1:-1]= [5, 4, 3] 回答2 切片符号为[start:stop:step] 。 这意味着“ start ,然后step增加,直到end 。” 类似于此构造: counter = 0 stop = 10 step = 1 while counter < stop: print(counter) counter += step 如预期的那样,将产生0到9 。 现在想象一下,如果我们尝试使用您使用的值进行尝试: counter = 2 stop = 5 step = -1 while counter < stop: print(counter)
  • Python切片操作方法,我知道Python切片,但是如何使用内置切片对象呢?(Python slice how-to, I know the Python slice but how can I use built-in slice object for it?)
    问题 内置函数slice用途是什么,如何使用? 我知道Pythonic切片的直接方法-l1 l1[start:stop:step] 。 我想知道是否有切片对象,然后如何使用它? 回答1 您可以通过使用与[start:end:step]表示法相同的字段来调用slice来创建slice: sl = slice(0,4) 要使用切片,只需将其作为索引传递到列表或字符串中即可: >>> s = "ABCDEFGHIJKL" >>> sl = slice(0,4) >>> print(s[sl]) 'ABCD' 假设您有一个固定长度的文本字段文件。 您可以定义切片列表,以轻松地从此文件中的每个“记录”中提取值。 data = """\ 0010GEORGE JETSON 12345 SPACESHIP ST HOUSTON TX 0020WILE E COYOTE 312 ACME BLVD TUCSON AZ 0030FRED FLINTSTONE 246 GRANITE LANE BEDROCK CA 0040JONNY QUEST 31416 SCIENCE AVE PALO ALTO CA""".splitlines() fieldslices = [slice(*fielddef) for fielddef in [ (0,4), (4, 21), (21,42), (42,56)
  • 如何在Python中获取字符串的前2个字母?(How to get the first 2 letters of a string in Python?)
    问题 假设我有一个字符串 Str1 = "TN 81 NZ 0025" str2 = "DL 11C AA 1111" two = first2(str1) print(two) >>>TN 如何获得这些字符串的前两个字母。 为此,我需要first2函数。 回答1 它就像string[:2]一样简单。 如果需要,可以轻松编写一个函数来执行此操作。 即使这样,也很简单 def first2(s): return s[:2] 回答2 通常,您可以使用string[i:j]从i到j的string[i:j] 。 string[:2]是string[0:2]简写。 这也适用于数组。 在官方教程中了解python的切片符号 回答3 t = "your string" 使用以下字符串播放字符串的前N个字符 def firstN(s, n=2): return s[:n] 默认情况下等于 t[:2] 回答4 以下是简单函数的外观: def firstTwo(string): return string[:2] 回答5 在python中,字符串是字符列表,但它们不是显式的列表类型,而只是类似列表的(即可以像列表一样对待)。 更正式地讲,它们称为sequence (请参阅http://docs.python.org/2/library/stdtypes.html#sequence-types-str
  • Implementing python slice notation
    I'm trying to reimplement python slice notation in another language (php) and looking for a snippet (in any language or pseudocode) that would mimic the python logic. That is, given a list and a triple (start, stop, step) or a part thereof, determine correct values or defaults for all parameters and return a slice as a new list. I tried looking into the source. That code is far beyond my c skills, but I can't help but agree with the comment saying: /* this is harder to get right than you might think */ Also, if something like this is already done, pointers will be greatly appreciated. This is
  • 零基础入门学Python(五)—— 列表、元组和字符串(下)
    零基础入门学Python系列内容的学习目录 → \rightarrow →零基础入门学Python系列内容汇总。列表、元组和字符串(下)1. 列表2. 元组3. 字符串3.2.1 format()3.2.2 格式化操作符:%3.2.3 Pyhton的转义字符及含义3.1 各种内置方法3.2 格式化4. 序列  需要学习的基础知识有:列表、元组、字符串、序列等。因本部分内容较多,故分为上下两个篇章。     1、2部分内容见零基础入门学Python(五)—— 列表、元组和字符串(上)     3、4部分内容见零基础入门学Python(五)—— 列表、元组和字符串(下)1. 列表2. 元组  前半部分内容见零基础入门学Python(五)—— 列表、元组和字符串(上)。3. 字符串  字符串跟元组一样,都是一旦定下来就不能直接对它们进行修改了。对于之前应用到列表和元组中的分片概念,也可以应用于字符串之上,对字符串进行间接修改。  example1:>>>str = “I am learning Python.”        >>>str[ : 4 ]        ‘I am’  example2:>>>str = “I am learning Python.”        >>>str[ : 4 ] + “插入的字符串” + str[ 4 : ]        ‘I
  • 小甲鱼python听课笔记p11-p17 基础部分完结
    p11 7.1 列表1 = 打了激素的数组 列表可以存放不同类型的数,还可以创建空列表 append():向列表里面添加数据 末尾添加一个元素 但是只能一次插入一个数据 extend():扩张的方式来扩展列表 末尾添加多个元素,但要求已列表的格式添加[x,x,x,x] 用一个列表来扩展另一个列表,所以他的参数是一个列表,不能直接像append那样来用 insert():两个参数,插入 insert(1,‘kk’):在a的位置后面插入kk,相当于从0开始数,在1的位置放入kk 课后习题: 不一样 假设给定以下列表:member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳'] 要求将列表修改为:member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88] p12 列表2 index:从列表中获取元素,下标都是从0开始 从列表删除元素 remove() del() del + 列表名,可以把整个列表删掉 pop():从列表中取出最后一个元素并返回给你 列表分片slice slice:一次性需要获取多个元素 member[1:3]:1是开始位置,3是结束位置,但结果不包含3 源列表不发生任何改变 课后习题: 2.如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做? 4