Python列表切片

时间:2014-04-02 04:32:45

标签: python list

为什么第一个输出包含第一个元素(在我看来好像是好行为,因为它以0索引(即第一个元素)开头,然后以len(a)-1递增(最后一个元素) ))。

问题是第二个例子(如果它始终以零索引开始然后递增)应该是[1, 5, 4, 3, 2],或者?

输出1: [1, 5]

输出2: [5, 4, 3, 2, 1]

a = [1, 2, 3, 4, 5]

print(a[::len(a)-1])

print(a[::-1])

4 个答案:

答案 0 :(得分:4)

切片中的最后一个参数是步长值。如果步骤为正,则从0开始,如果步骤为负,则从-1开始。 Relevant piece of code from sliceobject.c

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

所以,当你说

a[::-1]

并且由于步骤为负,它只是从最后一个元素开始。它继续将索引递增-1并返回生成的列表。所以,它基本上颠倒了这个清单。

但是,当你说

a[::len(a)-1]

步长值为4.由于步长为正,它从第一个元素开始,即1,并将索引增加4并选择索引4处的元素(初始索引(0)+4 = 4),即5.这就是返回[1, 5]的原因。

答案 1 :(得分:2)

你所拥有的是extended slices 无论你在::之后提到的是你要添加到0索引元素的步长值

所以

>>> print(a[::len(a)-1])
[1, 5]

基本上是

 >>> print(a[::4)
    [1, 5]

获取0元素并将4添加到索引中并获取下一个元素。

负数的类似行为。

>>> print(a[::-1)
        [5, 4, 3, 2, 1]

-1添加到索引(或从索引中减1),使其成为0-15(数组中的最后一个元素)。

答案 2 :(得分:2)

以下是python list切片的工作原理:

a[start:end] # items start through end-1

还有步骤值,可以与上述任何一个一起使用:

a[start:end:step] # start through not past end, by step

另一个特性是开始或结束可能是负数,这意味着它从数组的末尾而不是从开头开始计数。所以:

a[-1]    # last item in the array
a[-2:]   # last two items in the array
a[:-2]   # everything except the last two items

所以,在你的情况下,

a[::len(a)-1] 将数组从开始到结束以len(a)-1 = 4的步长切片,即[1,5](跳过三个项目并保留第四个项目)

a[::-1]反转数组。

答案 3 :(得分:0)

当您提供否定step时,开始和停止的默认值(粗略地)切换:它将在列表末尾开始,并且停止一开始。我粗略地说&#39;因为,正如您所见,它经过调整,以便a[::-1]仍然包含a的所有元素 - 这意味着它实际上等同于a[-1:-len(a):-1]。造成这种情况的原因可能与语法有多尴尬有关,与将序列与其比较的有用程度相比,它意味着a[0:-1:-1]为空。

对于支持此语法的所有内置函数(列表,元组和字符串)都是如此,但对于支持它的第三方模块的任何类型,必然为真(这取决于各个类)什么切片意味着他们)。