【问题标题】:Python list slicePython列表切片
【发布时间】:2014-05-13 03:44:04
【问题描述】:

为什么第一个输出包含第一个元素(在我看来这是一种很好的行为,因为它以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])

【问题讨论】:

  • 找到这个 SO 参考:http://stackoverflow.com/questions/5876998/reversing-list-using-slice-notation。会有用的。

标签: python list


【解决方案1】:

当您提供否定的step 时,开始和停止的默认值(大致)切换:它将在列表末尾开始,然后停止一开始。我说“大致”是因为,正如您所见,它被调整为a[::-1] 仍然包含a 的所有元素——意思是,它实际上等同于a[-1:-len(a):-1]。造成这种情况的原因可能与该语法的笨拙程度有关,而将序列反转与它的含义相比,它意味着a[0:-1:-1],它是空的。

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

【讨论】:

    【解决方案2】:

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

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

    还有步长值,可以和上面的任何一个一起使用:

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

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

    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】:

      你拥有的东西叫做extended slices:: 之后提到的任何内容都是您要添加到0 索引元素的步长值

      所以

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

      基本上是

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

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

      负数的类似行为。

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

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

      【讨论】:

        【解决方案4】:

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

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

        所以,当你说

        a[::-1]
        

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

        但是,当你说

        a[::len(a)-1]
        

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

        【讨论】:

        • 请注意,它会更改 默认 开始和停止,而不是切换它们的解释 - 否则,a[0:-1:-1] 将等同于 a[::-1] 而不是为空。
        猜你喜欢
        • 2017-06-24
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 2014-11-02
        • 1970-01-01
        相关资源
        最近更新 更多