分享
三行代码  ›  专栏  ›  技术社区  ›  user3105173

python切片的奇怪行为

  •  4
  • user3105173  · 技术社区  · 3 天前

    假设我们有这个清单:

    >>> a = [x for x in range(10)]
    >>> print(a)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    另外,两种方法都可以按预期分割工作:

    >>> a[3:8]
    [3, 4, 5, 6, 7]
    
    >>> a[::-1]
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    

    但是,如果结合起来:

    >>> a[3:8:-1]
    []
    

    我希望是 [7, 6, 5 ,4, 3] 或者也许 [6, 5, 4, 3, 2] (如果先倒车)。 考虑一下当 start stop 未传递参数:

    >>> a[:5:-1]
    [9, 8, 7, 6]
    

    这几乎是我所期望的,只差一项。测试了这个 numpy 它的行为似乎也一样。

    这是怎么回事?

    3 回复  |  直到 3 天前
        1
  •  7
  •   Carcigenicate    3 天前

    a[3:8:-1]
    

    切片的开始和停止位置不会根据步骤进行调整。如果步骤为负,则从3开始倒转,但是没有索引在3到8之间的元素从3开始倒数,因此得到一个空列表。

    您需要相应地设置开始和停止:

    a[8:3:-1]
    

    从8到4。

        2
  •  5
  •   Jean-François Fabre    3 天前

    a[3:8:-1] 指示python从3开始,按-1的步骤转到8

    这将创建一个空列表:通过添加 -1 (就像 list(range(3,8,-1)) 这也给出了一个空列表)

    当你这样做的时候 a[:5:-1] 然后start是默认的start,python将其设置为“end of list”,这样它就“工作了”

    和你一样 a[::-1] start&stop是默认的,python知道它们是从头到尾的(否则这个符号将不可用)

        3
  •  2
  •   sammy    3 天前

    这种行为在 documentation

    从i到j的s切片定义为索引为k的项序列,这样i<=k<j。如果i或j大于len(s),则使用len(s)。如果省略或没有,请使用0。如果j被省略或没有,使用len(s)。如果i大于或等于j,则切片为空。

    从i到j的s切片,步骤k。。。。到达j时停止(但不包括j)。当k为正时,如果i和j的值较大,则它们将减为len(s)。当k为负时,如果i和j的值较大,则它们将被减为len(s)-1。如果i或j被省略或没有,它们将成为结束值(哪个结束取决于k的符号)。