我不明白在Python中使用负边界切片。这应该怎么样?

时间:2009-01-29 19:31:48

标签: python slice

我是Python的新手,并且在我的书中遇到了以下示例,但没有得到很好的解释。这是我从翻译中打印出来的:

>>> s = 'spam'
>>> s[:-1]
'spa'

为什么没有开始绑定的切片和'-1'返回除最后一个元素之外的所有元素?调用s[0:-1]在逻辑上与调用s[:-1]相同吗?它们都返回相同的结果。但我不确定python正在做什么。任何帮助将不胜感激。

7 个答案:

答案 0 :(得分:30)

是的,调用s[0:-1]与调用s[:-1]完全相同。

在python中使用负数作为索引返回列表右侧的第n个元素(与通常的左侧相反)。

所以如果你有一个列表:

myList = ['a', 'b', 'c', 'd', 'e']
print myList[-1] # prints 'e'

print语句将打印“e”。

一旦你理解了(你可能已经知道,这不是完全清楚你是否感到困惑)我们可以开始讨论切片。

我将假设您了解myList[2:4](将返回['c', 'd'])的切片的基本知识,并直接跳到切片表示法,其中一边留空。< / p>

正如您在帖子中所怀疑的那样,myList[:index]myList[0:index]完全相同。

顺便说一下,这也是另一种方式...... myList[index:]myList[index:len(myList)]相同,并将从index开始返回列表中所有元素的列表直到最后(例如print myList[2:]将打印['c', 'd', 'e'])。

作为第三个注释,您甚至可以print myList[:]执行 no 索引,这基本上会返回整个列表的副本(相当于myList[0:len(myList)],返回['a','b','c','d','e'])。如果您认为myList将在某个时刻发生变化但是您希望将其副本保持在当前状态,那么这可能很有用。

如果你还没有这样做,我发现只是在Python解释器中弄乱了一大堆帮助理解这些东西。我推荐IPython

答案 1 :(得分:4)

关键的一点是,python索引应该被认为是指向列表中条目之间的空格的指针,而不是元素本身。因此,0指向开头,1指向第一和第二,...和n指向第n和第(n + 1)st。

因此l [1:2]给出一个只包含元素l [1]的列表,因为它给出了两个指针之间的所有内容。

类似地,负指数指向元素之间,但这次从后面开始计数,所以最后一个元素和倒数第二个元素之间的-1个点,所以[0:-1]指的是一个项目块而不是包括最后一个。

作为语法糖,你可以从开头或实际上结束时离开0,所以l [n:]指的是从l [n]到结尾的所有内容(如果n&gt; = len(l)则它返回空列表。)

答案 2 :(得分:4)

>>> l = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz&']

# I want a string up to 'def' from 'vwx', all in between
# from 'vwx' so -2;to 'def' just before 'abc' so -9; backwards all so -1.
>>> l[-2:-9:-1]
['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def']

# For the same 'vwx' 7 to 'def' just before 'abc' 0, backwards all -1
>>> l[7:0:-1]
['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def']

请不要对列表无精打采。

  1. 先写下第一个元素。您可以使用正或负指数 为了那个原因。我很懒,所以我使用正面,一次减少(低于7,或-3开始)。
  2. 您想要停止的元素的索引。 同样,您可以使用正或负指数(低于2或-8表示止损)。
  3. 这里有重要意义;当然 - 倒退;你知道的步伐的价值。 Stride是一个&#39;矢量&#39;大小和方向(低于-1,向后全部)。

    l = [0,1,2,3,4,5,6,7,8,9]
    l[7:2:-1], l[-3:2:-1], [-3:-8:-1],l[7:-8:-1]
    

    所有结果均为[7, 6, 5, 4, 3]

答案 3 :(得分:3)

负数指数从结尾开始计算,因此s [: - 1]相当于s [:len(s)-1],s [-1]是最后一个元素,例如。

答案 4 :(得分:1)

是的,调用s[0:-1]在逻辑上与s[:-1]相同,因为切片最好定义为:

[beginning_index:ending_index]

Python允许你省略0,因为这可以让你的代码更加简洁。

答案 5 :(得分:0)

如果我们要从字符串的后端打印,可以进行负索引。索引从-1开始。

示例:s ='hello world'

s [-11:-1] ='你好世界' s [-1:-11] =''//起始值应较小(即,在这种情况下-1大于-11),如果较大则将不会打印任何内容。

答案 6 :(得分:0)

我将解决其他一些人遗漏的问题:

如何根据我们对切片的了解来解释此负索引?

通常,当我们进行切片时,我们谈论的是[包含,排他]范围。所以

A = [1,3,4,6]
A[1:3] # will give us 3-1 = 2 elements, index 1 and 2 => [3,4]

因此,当切片中有一个负索引A[1:-1]时,这意味着我们有A[1:len(A)-1] = A[1:3],这又为我们提供了索引1和2,因此还有[3,4]

请注意,即使列表的长度为4,其最后一个索引为3,因此为什么使用这种-1表示法就​​可以了。还要注意,如果您有将负索引作为变量的代码,那么您将需要手动检查0,因为 A[:-0] == A[:0] == [] `